Как изменить приоритет процесса в powershell, если он выполняется с параметром-Wait?

#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 свойство, но лучше не выполнять собственные циклы и опросы, если только вам не пришлось выполнять какие-то другие действия во время ожидания.