如何在单个变量中定义多Azure资源组与VM名称以批量禁用自动关机
批量禁用Azure多资源组VM自动关机脚本优化
要实现批量处理多资源组的VM,你可以用哈希表数组定义资源组与VM的对应关系,明确每个VM所属的RG(避免同名VM混淆),再通过循环遍历复用原有禁用逻辑即可。以下是优化后的完整脚本:
# 连接Azure账户 Connect-AzAccount # 定义需要处理的资源组和VM列表,每个元素对应一组RG+VM $vmList = @( @{ ResourceGroup = "RG-Test1"; VMName = "devvm1" }, @{ ResourceGroup = "RG-Test1"; VMName = "devvm2" }, @{ ResourceGroup = "RG-Test2"; VMName = "prodvm1" }, @{ ResourceGroup = "RG-Test3"; VMName = "testvm1" } ) # 自动关机配置参数(保持原设置) $shutdown_time = "0000" $shutdown_timezone = "India Standard Time" $subscriptionId = (Get-AzContext).Subscription.Id # 循环处理每个VM foreach ($vmItem in $vmList) { $rgName = $vmItem.ResourceGroup $vmName = $vmItem.VMName # 仅调用一次API获取VM信息,避免重复查询 $vm = Get-AzVM -ResourceGroupName $rgName -Name $vmName -ErrorAction SilentlyContinue if (-not $vm) { Write-Warning "VM [$vmName] 在资源组 [$rgName] 中不存在,跳过处理" continue } # 构造自动关机禁用配置 $properties = @{ "status" = "Disabled" "taskType" = "ComputeVmShutdownTask" "dailyRecurrence" = @{"time" = $shutdown_time } "timeZoneId" = $shutdown_timezone "notificationSettings" = @{ "status" = "Disabled" "timeInMinutes" = 0 } "targetResourceId" = $vm.Id } # 构造自动关机资源的唯一ID $shutdownResourceId = "/subscriptions/{0}/resourceGroups/{1}/providers/microsoft.devtestlab/schedules/shutdown-computevm-{2}" -f $subscriptionId, $rgName, $vmName # 执行禁用操作并处理异常 try { New-AzResource -ResourceId $shutdownResourceId -Location $vm.Location -Properties $properties -Force -ErrorAction Stop Write-Host "已成功禁用VM [$vmName](资源组:$rgName)的自动关机功能" -ForegroundColor Green } catch { Write-Error "处理VM [$vmName](资源组:$rgName)时出错:$_" } }
关键优化说明
- 明确对应关系:用哈希表数组存储RG和VM的配对,支持跨RG批量处理,也兼容同一RG下的多个VM
- 减少API调用:将
Get-AzVM的结果缓存到变量,避免重复查询Azure API,提升脚本运行效率 - 容错处理:添加VM不存在的判断和异常捕获,单个VM出错不会导致整个脚本中断
- 状态可视化:用不同颜色的输出提示处理结果,方便快速排查问题
扩展:处理资源组下所有VM
如果需要禁用某个RG下全部VM的自动关机,可将脚本改为遍历资源组+该RG内所有VM:
# 定义需要处理的资源组列表 $resourceGroups = @("RG-Test1", "RG-Test2", "RG-Test3") foreach ($rgName in $resourceGroups) { # 获取当前RG下的所有VM $vms = Get-AzVM -ResourceGroupName $rgName -ErrorAction SilentlyContinue if (-not $vms) { Write-Warning "资源组 [$rgName] 中无VM,跳过处理" continue } foreach ($vm in $vms) { # 复用上面脚本中的配置构造、资源ID生成、执行逻辑即可 # ... 省略重复代码 ... } }
内容的提问来源于stack exchange,提问作者Lokesh M
相关产品推荐
相关产品推荐

