У меня есть сценарий PowerShell 2.0, который работает с большими общими файлами сверху вниз, исправляя разрешения и т. Д., Запуская другой исполняемый файл через Start-Process и ожидая результатов и кодов выхода, с кодом, подобным этому:
Start-Process -FilePath $exe -ArgumentList $allargs -Wait -Passthru -NoNewWindow -RedirectStandardOutput $tempoutputfile -RedirectStandardError $temperrorfile;
Сценарий будет отлично работать в течение нескольких часов, обрабатывая тысячи записей, а затем в конечном итоге начнет выдавать странные ошибки, подобные следующим:
" Start-Process: невозможно обработать запрос, поскольку процесс (PID) завершен. " - процесс закрылся так быстро, что статус не был возвращен?
" Start-Process: эта команда не может быть выполнена из-за ошибки: недостаточно места для обработки этой команды. " - на общей файловой папке свободно более 20 ГБ Я работаю над системным диском на двух разных системах, на которых я тестировал (не говоря уже о свободной оперативной памяти и виртуальной памяти).
Обратите внимание, что я использую встроенный командлет Start-Process, а не PSCX - но, между прочим, он ведет себя одинаково (поскольку оба они основаны на .NET-классе процессов в любом случае).
Также обратите внимание, что это совсем не похоже на проблему управления памятью - процесс PowerShell достигает пика в менее чем 100 МБ рабочего набора на ранних этапах процесса и никогда не выходит за пределы этого в течение нескольких часов работы.
У кого-нибудь есть идеи, как остановить эти ошибки? Или как их отладить?
----- Решение -----
Спасибо @JPBlanc за указание на следующие решения:
1.) Чтобы устранить ошибки «Недостаточно памяти для обработки этой команды», я запустил сценарий PowerShell на локальном сервере, на котором размещен общий файловый ресурс (а не над общим ресурсом CIFS, на который влияет некоторая память). ограничения).
2.) Чтобы устранить ошибки «Невозможно обработать запрос, потому что процесс (PID) вышел»), мне пришлось добавить дополнительное тестирование свойства HasExited объекта System.Diagnostics.Process, как показано ниже:
$ps = Start-Process -FilePath $exe -ArgumentList $allargs -Wait -Passthru -NoNewWindow -RedirectStandardOutput $tempoutputfile -RedirectStandardError $temperrorfile;
do {} until ($ps.HasExited); # wait...
$ps.ExitCode; # <-- this is what I really needed from the output
Скрипт теперь работает без ошибок!