#powershell #wait #start-process
Вопрос:
Я использую запланированный сценарий PowerShell для запуска одного и того же процесса с различными аргументами много раз в цикле. Процесс очень трудоемкий в вычислениях и выполняется в течение длительного времени, и у меня есть тысячи итераций. Я заметил, что, поскольку это запланированный сценарий, он выполняется с приоритетом ниже нормального. И даже если я столкнусь с этим, любые порожденные процессы все равно будут ниже нормы. Итак, поскольку я запускаю этот процесс в цикле тысячи раз, мне нужно использовать -Wait
вот так:
foreach($list in $lists){
Start-Process -FilePath $path_to_EXE -ArgumentList $list -NoNewWindow -Wait
}
Теперь я хочу повысить приоритет, и один из способов, который я нашел, состоял в том, чтобы сделать это:
($MyProcess = Start-Process -FilePath $path_to_EXE -ArgumentList $list -NoNewWindow -Wait -PassThru).PriorityClass = [System.Diagnostics.ProcessPriorityClass]::AboveNormal
Однако это не работает, потому что ему нужно дождаться завершения процесса, а затем выполнить все, что находится за скобками: (...).PriorityClass = ...
Я не могу позволить ему продолжать цикл и порождать тысячи процессов, мне нужно запускать по одному за раз, но как мне сказать ему повысить приоритет, а затем подождать?
Ответ №1:
Вы можете выполнить акт ожидания в своем коде, посредством Wait-Process
:
foreach($list in $lists) {
$MyProcess = Start-Process -FilePath $path_to_EXE -ArgumentList $list -NoNewWindow -PassThru
$MyProcess.PriorityClass = [System.Diagnostics.ProcessPriorityClass]::AboveNormal
$Myprocess | Wait-Process
}
Объект, возвращаемый из Start-Process
, также имеет .WaitForExit()
метод:
foreach($list in $lists) {
$MyProcess = Start-Process -FilePath $path_to_EXE -ArgumentList $list -NoNewWindow -PassThru
$MyProcess.PriorityClass = [System.Diagnostics.ProcessPriorityClass]::AboveNormal
$Myprocess.WaitForExit()
}
Комментарии:
1. да, это работает. Спасибо! Я попробовал
$pinfo = New-Object System.Diagnostics.ProcessStartInfo
и$p.StartInfo = $pinfo $p.Start() | Out-Null $p.WaitForExit()
, но это не сработало2. @miguello Вы также можете использовать
$MyProcess.WaitForExit()
с выводомStart-Process
, вместо того, чтобы совершать дополнительный вызов. У него также есть.HasExited
свойство, но лучше не выполнять собственные циклы и опросы, если только вам не пришлось выполнять какие-то другие действия во время ожидания.