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

Azure Site Recovery计划预/后置动作代码无法列出VM,求优化方案

Azure Site Recovery恢复计划预/后置脚本优化方案

原代码无法列出VM的核心问题如下:

  • 引用了未定义的变量$RecoveryPlanContextObj,应为传入的$RecoveryPlanContext
  • 循环中未正确从VmMap提取VM对象,$VM变量未初始化
  • 不必要的Azure上下文清理操作,干扰托管身份登录流程
  • Verbose日志被禁用,无法排查执行问题
  • 未正确处理空集合的返回逻辑

优化后的代码

param (
    [parameter(Mandatory=$true)]
    [Object]$RecoveryPlanContext
)

# 配置日志与错误处理
$ErrorActionPreference = 'Stop'
$VerbosePreference = 'Continue'

# 使用托管身份登录Azure(ASR环境中无需提前清理上下文)
Write-Verbose "使用托管身份登录Azure"
Connect-AzAccount -Identity | Out-Null

# 从RecoveryPlanContext中提取VM映射
Write-Verbose "获取恢复计划中的VM映射"
$vmMap = $RecoveryPlanContext.VmMap

$VMCollection = @()

# 遍历VmMap中的所有VM
foreach ($vmId in $vmMap.PSObject.Properties.Name) {
    # 获取当前ID对应的VM对象
    $vm = $vmMap.$vmId
    if ($vm) {
        $VMCollection += $vm
        Write-Verbose "已添加VM: $($vm.RoleName)"
    }
}

# 输出集合数量
Write-Output "VM集合数量: $($VMCollection.Count)"

# 返回VM的RoleName列表(处理空集合情况)
if ($VMCollection.Count -gt 0) {
    $VMCollection.RoleName
} else {
    Write-Output "未找到任何VM"
}

关键优化说明

  1. 修复变量引用错误:将$RecoveryPlanContextObj改为正确的$RecoveryPlanContext
  2. 正确提取VM对象:通过$vmMap.PSObject.Properties.Name获取VM ID,再通过$vmMap.$vmId获取对应VM实例
  3. 简化登录流程:移除不必要的Disconnect-AzAccount、Clear-AzContext操作,ASR运行环境中托管身份登录无需额外清理
  4. 增强日志排查:启用VerbosePreference为Continue,添加关键步骤的日志输出,便于调试
  5. 健壮性处理:添加空集合判断,避免无VM时出现空值报错
  6. 严格错误处理:将ErrorActionPreference设为Stop,确保脚本遇到错误时及时终止,便于排查问题

内容的提问来源于stack exchange,提问作者user989865

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 05:52:53