GitHub上已有feature request異步執行此類操作,這些操作應在不久的將來實施。
在此期間,你可以不喜歡使用PoshRSJob模塊下面的一個解決辦法 - 只要你的資源組的名稱替換temp4so
# Install PoshRSJob if necessary
#
# Install-Module PoshRSJob
Login-AzureRmAccount
$start = Get-Date
$jobs = Get-AzureRmVM -ResourceGroupName temp4so |
% {
Get-AzureRmVM -ResourceGroupName temp4so -Name $_.Name -Status
} |
% {
if (-Not ($_.Statuses[1].DisplayStatus -like "*deallocated*")) {
$vm = $_
Start-RSJob {
Stop-AzureRmVM -ResourceGroupName temp4so -Name ($using:vm).Name -Force
}
}
}
$jobs | Wait-RSJob | Receive-RSJob
$jobs | Remove-RSJob
$end = Get-Date
Write-Host ("Stopping took {0}" -f ($end - $start))
這在我的測試情況下與3個虛擬機導致類似於輸出以下這表明其中平行
OperationId :
Status : Succeeded
StartTime : 24.09.2016 18:49:10
EndTime : 24.09.2016 18:51:32
Error :
OperationId :
Status : Succeeded
StartTime : 24.09.2016 18:49:11
EndTime : 24.09.2016 18:51:22
Error :
OperationId :
Status : Succeeded
StartTime : 24.09.2016 18:49:11
EndTime : 24.09.2016 18:51:22
Error :
Stopping took 00:02:32.9115538
注進行操作:你不能簡單的使用標準Start-Job
來卸載同步。由於後臺新創建的PowerShell實例不會與您的初始會話共享上下文,因此需要您爲每個會話再次進行身份驗證。由於PoshRSJob在初始PowerShell實例中使用PowerShell運行空間,因此不需要再次進行身份驗證。
非常感謝,它正是我所需要的。我剛剛測試過它,它工作 – miticoluis
這個腳本只停止前5個虛擬機,無論我運行多少次。無論如何關閉所有虛擬機? – WinBoss
@WinBoss,有兩個原因(我可以看到)爲什麼你只看到一些虛擬機關機。 1.您是否有位於不同資源組的虛擬機?此腳本一次只針對一個資源組。 2.您使用的是經典部署還是資源管理器部署?如果是這樣,示例腳本正在使用RM模塊。只需將它們切換到Get-AzureVM,Stop-AzureVM等經典模塊即可。 更多信息,請訪問:https://docs.microsoft.com/en-us/azure/azure-resource-manager/resource -manager-deployment-model – GrayDwarf