PowerShell: Ожидание завершения задач с помощью Wait-Job
Командлет Wait-Job дожидается, пока одна или все задачи PowerShell, выполняющиеся в сессии, не перейдут в состояние завершения. В этом блоге я покажу вам пример, на основе которого вы сможете построить свое. Давайте начнем.
Start-Job создает одну или несколько фоновых задач PowerShell. Эти задачи выполняются скрыто в фоновом режиме и позволяют вам продолжать работу в PowerShell. Этот пример запускает фоновую задачу сканирования порта.
Start-Job -Name PortScan -ScriptBlock {Test-NetConnection 192.168.0.150 -Port 88}
Get-Job -Name PortScan
Чтобы отобразить результаты этой задачи, выполните Receive-Job. Обратите внимание, что вы можете отобразить результат только один раз! Если только вы не используете параметр -Keep.
Receive-Job -Name PortScan -Keep | Select-Object RemoteAddress,PingSucceeded,TcpTestSucceeded
Ждет, пока одна или все задачи PowerShell, выполняющиеся в сессии, не перейдут в состояние завершения.
Microsoft описывает это так:
Cmdlet Wait-Job ожидает, пока задание не перейдет в состояние завершения, прежде чем продолжить выполнение. Завершающие состояния:
- Завершено
- Не удалось
- Остановлено
- Приостановлено
- Отключен
Вы можете подождать, пока указанная задача или все задачи не окажутся в состоянии завершения. Вы также можете установить максимальное время ожидания для задачи, используя параметр Timeout, или использовать параметр Force, чтобы подождать задачу в состоянии Suspended или Disconnected.
https://learn.microsoft.com/ru-ru/powershell/module/microsoft.powershell.core/wait-job?view=powershell-7.3
Вот пример того, как создаются 2 задачи. Ожидание второй задачи, которая занимает очень много времени. Обе задачи не связаны, но хороши для тестирования. Наконец, вторая задача вызывается, но только после завершения первой задачи.
Get-Job | Remove-Job -Force
Start-Job -Name PortScan -ScriptBlock {Test-NetConnection 192.168.0.150 -Port 88}
Start-Job -Name Files -ScriptBlock {Get-ChildItem C:\Windows -File -Recurse}
Wait-Job -Name Files
Receive-Job -Name PortScan -Keep | Select-Object RemoteAddress,PingSucceeded,TcpTestSucceeded
Надеюсь, это было полезно, и теперь вы можете использовать командлет Wait-Job в своих скриптах PowerShell.

