这个脚本基于Invoke-Parallel方法并行开关Azure ARM虚拟机:
Invoke-Parallel脚本下载地址和介绍请参考链接:https://gallery.technet.microsoft.com/scriptcenter/Run-Parallel-Parallel-377fd430
脚本如下:
#AzurePortalLoginUsername是Azure的Portal登录名,例如XXX@XXXX.partner.onmschina.cn
$AzurePortalLoginUsername = "XXXXXXXXXXXXX";
#AzurePortalLoginPassword是登陆密码
$AzurePortalLoginPassword = "XXXXXXXXXXXXX";
#虚拟机所在的订阅名称
$SubscriptionName = "XXXXXXXXXXXXX";
function Invoke-Parallel {...}
#定义登陆的Credential
$e1=Get-AzureRmEnvironment -Name AzureChinaCloud;
$Cred = New-Object System.Management.Automation.PSCredential($AzurePortalLoginUsername,(ConvertTo-SecureString $AzurePortalLoginPassword -AsPlainText -Force));
$AzureRMCred = Get-Credential -Credential $Cred;
#登陆
Login-AzureRmAccount -Environment $e1 -Credential $AzureRMCred;
#定义要开/关的虚拟机ResourceGroupName是虚拟机资源组&虚拟机列表,等号左侧是虚拟机所属的资源组名称,等号右侧是资源组下要开/关的虚拟机名字,如果有多台,用分号分隔
$VMs = @{
"ResourceGroupName1" = "VM1;VM2;VM3 ....";
"ResourceGroupName2" = "VM1;VM2;VM3 ....";
#....
"ResourceGroupNameN" = "VM1;VM2;VM3 ...."
};
#切换到这个订阅下
Select-AzureRmSubscription -SubscriptionName $SubscriptionName;
foreach ($ResourceGroupName in $VMs.Keys)
{
#获取到这个ResourceGroup下要开/关机的虚拟机的名字列表
$vmnames = @();
foreach($vmname in $VMs[$ResourceGroupName].Split(";"))
{
$vmnames += $vmname;
}
#如果要开机,用下面这条命令,如果要关机,就把这条命令注释掉
$vmnames | Invoke-Parallel -ImportVariables -NoCloseOnTimeout -ScriptBlock { Start-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $_ }
#如果要关机,把下面这条命令的#号去掉,把上面Start-AzureRmVM注释掉(前面加#号)
#$vmnames | Invoke-Parallel -ImportVariables -NoCloseOnTimeout -ScriptBlock { Stop-AzureRmVM -ResourceGroupName $ResourceGroupName -Name $_ -Force }
}