Welcome PowerShell User! This recipe is just one of the hundreds of useful resources contained in the PowerShell Cookbook.
If you own the book already, login here to get free, online, searchable access to the entire book's content.
If not, the Windows PowerShell Cookbook is available at Amazon, or any of your other favourite book retailers. If you want to see what the PowerShell Cookbook has to offer, enjoy this free 90 page e-book sample: "The Windows PowerShell Interactive Shell".
You want to manage many computers simultaneously.
Use the -ThrottleLimit
and -AsJob
parameters to configure how PowerShell scales out your commands:
PS > $sessions = $( New-PSSession localhost; New-PSSession localhost; New-PSSession localhost) PS > $start = Get-Date PS > Invoke-Command $sessions { Start-Sleep 2; "Test $pid" } Test 720 Test 6112 Test 4792 PS > (Get-Date) - $start | Select TotalSeconds | Format-Table -Auto TotalSeconds ------------ 2.09375 PS > PS > $start = Get-Date PS > Invoke-Command $sessions { Start-Sleep 2; "Test $pid" } -ThrottleLimit 1 Test 6112 Test 4792 Test 720 PS > (Get-Date) - $start | Select TotalSeconds | Format-Table -Auto TotalSeconds ------------ 6.25
One of the largest difficulties in traditional networking scripts comes from managing many computers at once. Remote computer management is typically network-bound, so most scripts spend the majority of their time waiting for the network.
The solution to this is to scale. Rather than manage one computer at a time, you manage several. Not too many, however, as few machines can handle the demands of connecting to hundreds or thousands of remote machines at once.
Despite the benefits, writing a networking script that supports smart automatic throttling is beyond the capability of many and too far down “the big list of things to do” of most. Fortunately, PowerShell Remoting’s main focus is to solve these common problems, and throttling is no exception.
By default, PowerShell Remoting connects to 32 computers at a time. After running your command on the first 32 computers in your list, it waits for commands to complete before running your command on additional computers. As each command completes, PowerShell invokes the next one waiting.
To demonstrate this automatic scaling, the Solution shows the difference between calling Invoke-Command
with the default throttle limit and calling it with a throttle limit of one computer.
When working against many computers at a time, you might want to continue using your shell while these long-running tasks process in the background. To support background processing of tasks, the Invoke-Command
cmdlet offers -AsJob
, which lets you run your command as a PowerShell Job.
For more information about PowerShell Jobs, see Recipe 1.6.
Recipe 1.6, “Invoke a Long-Running or Background Command”
Recipe 29.5, “Invoke a Command on a Remote Computer”