Question:
All the tuts I have found use a pre defined sleep time to throttle jobs.
I need the throttle to wait until a job is completed before starting a new one.
Only 4 jobs can be running at one time.
So The script will run up 4 and currently pauses for 10 seconds then runs up the rest.
What I want is for the script to only allow 4 jobs to be running at one time and as a job is completed a new one is kicked off.
Jobs are initialised via a list of servers names.
Is it possible to archive this?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
$servers = Get-Content "C:\temp\flashfilestore\serverlist.txt" $scriptBlock = { #DO STUFF } $MaxThreads = 4 foreach($server in $servers) { Start-Job -ScriptBlock $scriptBlock -argumentlist $server While($(Get-Job -State 'Running').Count -ge $MaxThreads) { sleep 10 #Need this to wait until a job is complete and kick off a new one. } } Get-Job | Wait-Job | Receive-Job |
Answer:
You can test the following :
1 2 3 4 |
$servers = Get-Content "C:\temp\flashfilestore\serverlist.txt" $scriptBlock = { #DO STUFF } invoke-command -computerName $servers -scriptblock $scriptBlock -jobname 'YourJobSpecificName' -throttlelimit 4 -AsJob |
This command uses the Invoke-Command cmdlet and its AsJob parameter to start a background job that runs a scriptblock on numerous computers. Because the command must not be run more than 4 times concurrently, the command uses the ThrottleLimit parameter of Invoke-Command to limit the number of concurrent commands to 4.
Be careful that the file contains the computer names in a domain.