修改Azure VM启停PowerShell脚本以支持参数数组
跨订阅批量启停Azure VM脚本
核心修改说明
原脚本仅支持单订阅下的VM启停,重写后改为接受包含VMName、ResourceGroupName、AzureSubscriptionID、Action的参数数组,逐个循环处理每个参数组合,实现跨订阅批量操作,同时保留原脚本的Managed Identity认证、错误计数、VM通配符匹配等功能。
重写后的脚本
param( [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] # 包含VM操作信息的数组,每个元素需包含VMName、ResourceGroupName、AzureSubscriptionID、Action字段 [PSObject[]]$VMOperations ) Write-Output "脚本启动于 $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" # 临时隐藏警告信息,加载完成后恢复 $WarningPreference = "SilentlyContinue" Import-Module Az.Accounts, Az.Compute $WarningPreference = "Continue" $errorCount = 0 # 使用托管身份连接Azure try { $null = Connect-AzAccount -Identity } catch { $ErrorMessage = "连接Azure失败: " + $_.Exception.Message Write-Error $ErrorMessage throw $ErrorMessage exit } # 遍历每个VM操作任务 foreach ($vmOp in $VMOperations) { # 验证必要字段是否存在 $requiredFields = @("VMName", "ResourceGroupName", "Action") foreach ($field in $requiredFields) { if (-not $vmOp.PSObject.Properties[$field]) { $ErrorMessage = "操作任务缺少必填字段: $field" Write-Error $ErrorMessage $errorCount++ continue } } $vmName = $vmOp.VMName $rgName = $vmOp.ResourceGroupName $subId = $vmOp.AzureSubscriptionID $action = $vmOp.Action # 验证Action合法性 if ($action -notin "Start", "Stop") { $ErrorMessage = "无效的操作类型 '$action',仅支持Start/Stop" Write-Error $ErrorMessage $errorCount++ continue } try { # 切换到指定订阅(如果提供) if ($subId) { $null = Select-AzSubscription -SubscriptionID $subId -ErrorAction Stop Write-Output "已切换到订阅: $subId" } # 获取当前Azure上下文 $azContext = Get-AzContext -ErrorAction Stop if ([string]::IsNullOrEmpty($azContext.Subscription)) { throw "未找到有效Azure上下文,请确保托管身份已分配对应权限" } # 获取目标VM列表(支持通配符*) if ($vmName -eq "*") { $VMs = Get-AzVM -ResourceGroupName $rgName -ErrorAction Stop Write-Output "获取到资源组 $rgName 下的所有VM,共 $($VMs.Count) 台" } else { $VMs = Get-AzVM -ResourceGroupName $rgName -VMName $vmName -ErrorAction Stop } # 执行启停操作 foreach ($vm in $VMs) { Write-Output "开始$action VM: $($vm.Name) (订阅: $($azContext.Subscription.Id))" switch ($action) { "Start" { $null = $vm | Start-AzVM -ErrorAction Stop -NoWait } "Stop" { $null = $vm | Stop-AzVM -ErrorAction Stop -Force -NoWait } } Write-Output "$action VM $($vm.Name) 指令已发送" } } catch { $ErrorMessage = "处理任务失败 [VM: $vmName, RG: $rgName, Sub: $subId, Action: $action]: " + $_.Exception.Message Write-Error $ErrorMessage $errorCount++ } } $endText = "脚本结束于 $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" if ($errorCount -gt 0) { throw "共发生 $errorCount 处错误`r`n$endText" } Write-Output $endText
使用示例
# 定义批量操作任务数组 $vmTasks = @( # 启动订阅sub-id-001中RG01下的VM01 @{ VMName = "VM01" ResourceGroupName = "RG01" AzureSubscriptionID = "sub-id-001" Action = "Start" }, # 停止订阅sub-id-002中RG02下的所有VM @{ VMName = "*" ResourceGroupName = "RG02" AzureSubscriptionID = "sub-id-002" Action = "Stop" }, # 停止默认订阅中RG03下的VM03 @{ VMName = "VM03" ResourceGroupName = "RG03" Action = "Stop" } ) # 执行脚本 .\Batch-VMOperations.ps1 -VMOperations $vmTasks
内容的提问来源于stack exchange,提问作者learner
相关产品推荐
相关产品推荐

