'In Powershell, how to wait for parallel jobs to finish before proceeding?
Based on How to execute a PowerShell function several times in parallel?, I'm able to do this, where I stop all running jobs, in parallel.
# Run this in parallel
$stopService {
param($service)
Stop-Service -Name $service.name -Force
}
$services = Get-Services | Where-Oject {$_.name -like "*XYX_*"}
Foreach($service in Sservices) {
Start-Job -ScriptBlock $stopService -ArgumentList $service
}
$doSomethingElse
But how can I modify the code so all my parallel jobs finish first before I $doSomethingElse?. Kinda like a join() command?
Solution 1:[1]
You can capture all the instances of PSRemotingJob returned by Start-Job in a variable and then wait for them either using Wait-Job or using Receive-Job -Wait -AutoRemoveJob:
$jobs = foreach($service in $services) {
Start-Job -ScriptBlock $stopService -ArgumentList $service
}
Receive-Job $jobs -Wait -AutoRemoveJob
There are other alternatives, such as the one displayed in this answer, using a loop. For example:
while($jobs.State -contains 'Running') {
# do something here, track progress, etc
Start-Sleep 1
}
This answer shows a similar, more developed alternative, using a function to wait for Jobs with progress and a optional TimeOut parameter.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 |
