You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在单个变量中定义多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 12:35:11