Running cmdlets in parallel using PowerShell jobs
Important
Because Az PowerShell modules now have all the capabilities of AzureRM PowerShell modules and more, we'll retire AzureRM PowerShell modules on 29 February 2024.
To avoid service interruptions, update your scripts that use AzureRM PowerShell modules to use Az PowerShell modules by 29 February 2024. To automatically update your scripts, follow the quickstart guide.
PowerShell supports asynchronous action with PowerShell Jobs. Azure PowerShell is heavily dependent on making, and waiting for, network calls to Azure. You may often find yourself needing to make non-blocking calls. To address this need, Azure PowerShell provides first-class PSJob support.
Context Persistence and PSJobs
Since PSJobs are run as separate processes, your Azure connection must be shared with them. After
signing in to your Azure account with Connect-AzureRmAccount
, pass the context to a job.
$creds = Get-Credential
$job = Start-Job { param($context,$vmadmin) New-AzureRmVM -Name MyVm -AzureRmContext $context -Credential $vmadmin} -Arguments (Get-AzureRmContext),$creds
However, if you have chosen to have your context automatically saved with
Enable-AzureRmContextAutosave
, the context is automatically shared with any jobs you create.
Enable-AzureRmContextAutosave
$creds = Get-Credential
$job = Start-Job { param($vmadmin) New-AzureRmVM -Name MyVm -Credential $vmadmin} -Arguments $creds
Automatic Jobs with -AsJob
As a convenience, Azure PowerShell also provides an -AsJob
switch on some long-running cmdlets.
The -AsJob
switch makes creating PSJobs even easier.
$creds = Get-Credential
$job = New-AzureRmVM -Name MyVm -Credential $creds -AsJob
You can inspect the job and progress at any time with Get-Job
and Get-AzureRmVM
.
Get-Job $job
Get-AzureRmVM MyVm
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
1 Long Running Operation for 'New-AzureRmVM' AzureLongRunningJob`1 Running True localhost New-AzureRmVM
ResourceGroupName Name Location VmSize OsType NIC ProvisioningState Zone
----------------- ---- -------- ------ ------ --- ----------------- ----
MyVm MyVm eastus Standard_DS1_v2 Windows MyVm Creating
When the job completes, get the result of the job with Receive-Job
.
Note
Receive-Job
returns the result from the cmdlet as if the -AsJob
flag were not present. For
example, the Receive-Job
result of Do-Action -AsJob
is of the same type as the result of
Do-Action
.
$vm = Receive-Job $job
$vm
ResourceGroupName : MyVm
Id : /subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/MyVm/providers/Microsoft.Compute/virtualMachines/MyVm
VmId : dff1f79e-a8f7-4664-ab72-0ec28b9fbb5b
Name : MyVm
Type : Microsoft.Compute/virtualMachines
Location : eastus
Tags : {}
HardwareProfile : {VmSize}
NetworkProfile : {NetworkInterfaces}
OSProfile : {ComputerName, AdminUsername, WindowsConfiguration, Secrets}
ProvisioningState : Succeeded
StorageProfile : {ImageReference, OsDisk, DataDisks}
FullyQualifiedDomainName : myvmmyvm.eastus.cloudapp.azure.com
Example Scenarios
Create several VMs at once:
$creds = Get-Credential
# Create 10 jobs.
for($k = 0; $k -lt 10; $k++) {
New-AzureRmVm -Name MyVm$k -Credential $creds -AsJob
}
# Get all jobs and wait on them.
Get-Job | Wait-Job
"All jobs completed"
Get-AzureRmVM
In this example, the Wait-Job
cmdlet causes the script to pause while jobs run. The script
continues executing once all of the jobs have completed. Several jobs run in parallel then the
script waits for completion before continuing.
Id Name PSJobTypeName State HasMoreData Location Command
-- ---- ------------- ----- ----------- -------- -------
2 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
3 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
4 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
5 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
6 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
7 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
8 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
9 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
10 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
11 Long Running... AzureLongRun... Running True localhost New-AzureRmVM
2 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
3 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
4 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
5 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
6 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
7 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
8 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
9 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
10 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
11 Long Running... AzureLongRun... Completed True localhost New-AzureRmVM
All Jobs completed.
ResourceGroupName Name Location VmSize OsType NIC ProvisioningState Zone
----------------- ---- -------- ------ ------ --- ----------------- ----
MYVM MyVm eastus Standard_DS1_v2 Windows MyVm Succeeded
MYVM0 MyVm0 eastus Standard_DS1_v2 Windows MyVm0 Succeeded
MYVM1 MyVm1 eastus Standard_DS1_v2 Windows MyVm1 Succeeded
MYVM2 MyVm2 eastus Standard_DS1_v2 Windows MyVm2 Succeeded
MYVM3 MyVm3 eastus Standard_DS1_v2 Windows MyVm3 Succeeded
MYVM4 MyVm4 eastus Standard_DS1_v2 Windows MyVm4 Succeeded
MYVM5 MyVm5 eastus Standard_DS1_v2 Windows MyVm5 Succeeded
MYVM6 MyVm6 eastus Standard_DS1_v2 Windows MyVm6 Succeeded
MYVM7 MyVm7 eastus Standard_DS1_v2 Windows MyVm7 Succeeded
MYVM8 MyVm8 eastus Standard_DS1_v2 Windows MyVm8 Succeeded
MYVM9 MyVm9 eastus Standard_DS1_v2 Windows MyVm9 Succeeded
Feedback
Submit and view feedback for