Я хочу многократно выполнять программу в цикле.
Иногда программа дает сбой, поэтому я хочу ее убить, чтобы следующая итерация могла начаться правильно. Я определяю это через тайм-аут.
У меня работает тайм-аут, но я не могу получить код выхода программы, который мне также нужен для определения ее результата.
Раньше я не ждал с таймаутом, а просто использовал -wait в Start-Process, но это приводило к зависанию скрипта, если запущенная программа падала. Однако с этой настройкой я мог правильно получить код выхода.
Я выполняю из ISE.
for ($i=0; $i -le $max_iterations; $i++)
{
$proc = Start-Process -filePath $programtorun -ArgumentList $argumentlist -workingdirectory $programtorunpath -PassThru
# wait up to x seconds for normal termination
Wait-Process -Timeout 300 -Name $programname
# if not exited, kill process
if(!$proc.hasExited) {
echo "kill the process"
#$proc.Kill() <- not working if proc is crashed
Start-Process -filePath "taskkill.exe" -Wait -ArgumentList '/F', '/IM', $fullprogramname
}
# this is where I want to use exit code but it comes in empty
if ($proc.ExitCode -ne 0) {
# update internal error counters based on result
}
}
Как я могу
- Начать процесс
- Подождите, пока он упорядоченно выполнится и завершится
- Убейте его, если он разбился (например, тайм-аут хитов)
- получить код выхода из процесса
-ea 0 -ev timeouted
? Я нигде не могу найти их документально, но мне нужно определить, истекло ли время ожидания процесса ожидания или нет, и похоже, что это то, что вы используете в своем примере кода. 30.07.2018ea
означаетErrorAction
, а 0 — это значение перечисления для SilentlyContinue, поэтому я установил для ErrorAction для этой строки значение SilentlyContinue (что предотвращает остановку сценария в случае возникновения ошибки).-ev
означаетErrorVariable
. Я в основном определяю, что если возникает ошибка, записывайте ее в переменную$timeout
. 30.07.2018$
. 10.03.2020