如何通过定义资源组变量自动获取VM详情并批量禁用Azure VM自动关机
批量禁用指定资源组内所有Azure VM的自动关机
需求说明
需要编写PowerShell脚本,仅通过定义资源组名称数组,自动遍历每个资源组内的所有VM,批量禁用它们的自动关机选项,替代原脚本中手动指定VM名称的方式。
修改后的脚本
# 登录Azure账户 Connect-AzAccount # 定义目标资源组数组 $resourceGroups = @("RG-Test1", "RG-Test2") $shutdownTime = "0000" $shutdownTimeZone = "India Standard Time" $subscriptionId = (Get-AzContext).Subscription.Id # 遍历每个资源组 foreach ($rg in $resourceGroups) { # 获取当前资源组下的所有VM $vmsInRG = Get-AzVM -ResourceGroupName $rg # 遍历当前资源组内的每台VM foreach ($vm in $vmsInRG) { # 构造自动关机配置属性 $properties = @{ "status" = "Disabled" "taskType" = "ComputeVmShutdownTask" "dailyRecurrence" = @{"time" = $shutdownTime } "timeZoneId" = $shutdownTimeZone "notificationSettings" = @{ "status" = "Disabled" "timeInMinutes" = 0 } "targetResourceId" = $vm.Id } # 拼接自动关机计划的资源ID $shutdownResourceId = "/subscriptions/{0}/resourceGroups/{1}/providers/microsoft.devtestlab/schedules/shutdown-computevm-{2}" -f $subscriptionId, $rg, $vm.Name # 更新自动关机配置 New-AzResource -ResourceId $shutdownResourceId -Location $vm.Location -Properties $properties -Force } }
关键改动说明
- 移除手动定义的VM名称数组,改用
Get-AzVM -ResourceGroupName $rg自动获取目标资源组内的所有VM - 使用嵌套
foreach循环:外层遍历资源组,内层遍历该组下的VM,彻底避免原脚本中资源组与VM索引绑定的局限性 - 提前获取并缓存订阅ID,减少重复调用
Get-AzContext的开销 - 直接使用
$vm对象的内置属性(Id、Name、Location),避免重复查询相同VM信息
内容的提问来源于stack exchange,提问作者Lokesh M
相关产品推荐
相关产品推荐

