Полезный ответ Ансгара Вихера содержит хорошие указатели и рабочее решение, но , если вы просто хотите дождаться завершения всех порожденных процессов, используйте Wait-Process
проще .
При этом , если вы хотите проверить коды выхода по мере их появления до того, как все процессы завершатся, циклнеобходимо периодически (Start-Sleep
), как в ответе Ансгара, необходимо .
Следующее решение демонстрирует метод синхронного ожидания для всех с Wait-Process
супрощенный пример, который создает 3 экземпляра Блокнота и ожидает завершения всех из них:
# Create all processes and store objects representing them in array $procs.
$b = 3 # number of processes to create
$procs = foreach ($i in 0..($b-1)) { Start-Process -PassThru Notepad }
# Wait for all processes to exit.
# (Close the Notepad windows manually or, if no Notepad windows were previously
# open, use `Stop-Process -Name Notepad` from another session to forcefully close them.)
# Use Wait-Process -Timeout <secs> to limit the max. period of time to wait.
$procs | Wait-Process
# Get the exit codes.
$exitCodes = $procs.ExitCode # PSv3+; v2: $procs | Select-Object -ExpandProperty ExitCode
Или, как один конвейер:
# Use $_ inside { ... } to refer to the current iteration value.
# Use $procs.ExitCode to get the exit codes.
0..($b-1) | ForEach-Object -ov procs { Start-Process -PassThru Notepad } | Wait-Process
Обратите внимание на использование -ov
- сокращение от общего параметра -OutVariable
, который собирает объекты процесса, выводимые вызовами блока сценария ForEach-Object
командлета.