Kör cmdletar parallellt med hjälp av PowerShell-jobb

Viktigt

Eftersom Az PowerShell-moduler nu har alla funktioner i AzureRM PowerShell-moduler och mycket mer drar vi tillbaka AzureRM PowerShell-moduler den 29 februari 2024.

För att undvika avbrott i tjänsten uppdaterar du skripten som använder AzureRM PowerShell-moduler för att använda Az PowerShell-moduler senast den 29 februari 2024. Följ snabbstartsguiden om du vill uppdatera skripten automatiskt.

PowerShell har stöd för asynkrona åtgärder med PowerShell-jobb. Azure PowerShell är kraftigt beroende av att utföra och vänta på nätverksanrop till Azure. Du kanske ofta behöver utföra icke-blockerande anrop. För att uppfylla det behovet tillhandahåller Azure PowerShell förstklassigt PSJob-stöd.

Sammanhangsbeständighet och PSJobs

Eftersom PSJobs körs som separata processer måste Azure-anslutningen delas med dem. När du har loggat in på ditt Azure-konto med Connect-AzureRmAccount överför du sammanhanget till ett jobb.

$creds = Get-Credential
$job = Start-Job { param($context,$vmadmin) New-AzureRmVM -Name MyVm -AzureRmContext $context -Credential $vmadmin} -Arguments (Get-AzureRmContext),$creds

Men om du har valt att sammanhanget ska sparas automatiskt med Enable-AzureRmContextAutosave delas sammanhanget automatiskt med alla jobb som du skapar.

Enable-AzureRmContextAutosave
$creds = Get-Credential
$job = Start-Job { param($vmadmin) New-AzureRmVM -Name MyVm -Credential $vmadmin} -Arguments $creds

Automatiska jobb med -AsJob

För att förenkla processen tillhandahåller Azure PowerShell även en -AsJob-växel på vissa tidskrävande-cmdletar. -AsJob-växeln gör det enklare att skapa PSJobs.

$creds = Get-Credential
$job = New-AzureRmVM -Name MyVm -Credential $creds -AsJob

Du kan inspektera jobb och förlopp när som helst med Get-Job och 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

När jobbet har slutförts hämtar du resultatet av jobbet med Receive-Job.

Anteckning

Receive-Job returnerar resultatet från cmdleten som om flaggan -AsJob inte fanns. Till exempel, resultatet Receive-Job av Do-Action -AsJob är av samma typ som ett resultat av 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

Exempelscenarier

Skapa flera virtuella datorer samtidigt:

$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

I det här exemplet gör cmdleten Wait-Job att skriptet pausas medan jobben fortfarande körs. Skriptet fortsätter att köras när alla jobb har slutförts. Flera jobb körs parallellt och sedan väntar skriptet på att de slutförs innan det fortsätter.

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