Get-AzureRmVM -ResourceGroupName RG-VNETS |
ForEach-Object {
Get-AzureRmVM -ResourceGroupName RG-VNETS -Name $_.Name -Status
} |
ForEach-Object {
if (-Not ($_.Statuses[1].DisplayStatus -like "*deallocated*")) {
Stop-AzureRmVM -ResourceGroupName RG-VNETS -Name $_.Name -Force
}
}
我有这个脚本停止我所有的Azure VM,这里的问题是这个脚本一次关闭一个VM.
即如果我有三个VM:VM1,VM2,VM3
在VM1完全关闭之前,脚本不会关闭VM2,依此类推.我不知道是否有办法告诉PowerShell不要等待每个VM完全关闭以继续下面的操作.
最佳答案 在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个VM导致输出类似于以下内容,这表明操作并行完成
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运行空间,因此不需要再次进行身份验证.