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

