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

修改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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.01 07:43:22