Azure PowerShell获取ASR复制保护项详情时遇类型转换错误求助
问题重现
你运行以下代码获取复制项详情时,在第5行遇到了类型转换错误:
$VaultName = 'Site-recovery-vault-westus' $vault = Get-AzRecoveryServicesVault -Name $VaultName Set-AzRecoveryServicesAsrVaultContext -Vault $vault $fabric = Get-AzRecoveryServicesAsrFabric $container = Get-AzRecoveryServicesAsrProtectionContainer -Fabric $fabric Get-AzRecoveryServicesAsrReplicationProtectedItem -ProtectionContainer $container
错误信息:
Get-AzRecoveryServicesAsrProtectionContainer: Cannot convert 'System.Object[]' to the type 'Microsoft.Azure.Commands.RecoveryServices.SiteRecovery.ASRFabric' required by parameter 'Fabric'. Specified method is not supported.
原因分析
Get-AzRecoveryServicesAsrFabric这个命令如果你的恢复服务保管库中有多个fabric(比如多个本地站点或Azure区域),会返回一个对象数组(System.Object[])。但Get-AzRecoveryServicesAsrProtectionContainer的-Fabric参数只接受单个ASRFabric对象,直接传入数组就会触发类型不匹配的错误。
解决方案
根据你的实际场景,有几种处理方式:
1. 场景:只有一个Fabric
如果你的保管库中只有一个fabric,直接取数组的第一个元素即可:
$VaultName = 'Site-recovery-vault-westus' $vault = Get-AzRecoveryServicesVault -Name $VaultName Set-AzRecoveryServicesAsrVaultContext -Vault $vault # 取第一个fabric对象 $fabric = Get-AzRecoveryServicesAsrFabric | Select-Object -First 1 $container = Get-AzRecoveryServicesAsrProtectionContainer -Fabric $fabric Get-AzRecoveryServicesAsrReplicationProtectedItem -ProtectionContainer $container
2. 场景:有多个Fabric,指定目标Fabric名称
如果你知道要操作的fabric名称,直接通过-Name参数筛选出单个对象:
$VaultName = 'Site-recovery-vault-westus' $targetFabricName = "你的Fabric名称" # 替换为实际的fabric名称 $vault = Get-AzRecoveryServicesVault -Name $VaultName Set-AzRecoveryServicesAsrVaultContext -Vault $vault $fabric = Get-AzRecoveryServicesAsrFabric -Name $targetFabricName $container = Get-AzRecoveryServicesAsrProtectionContainer -Fabric $fabric Get-AzRecoveryServicesAsrReplicationProtectedItem -ProtectionContainer $container
3. 场景:遍历所有Fabric获取容器
如果你需要处理所有fabric下的保护容器,可以用foreach循环遍历每个fabric:
$VaultName = 'Site-recovery-vault-westus' $vault = Get-AzRecoveryServicesVault -Name $VaultName Set-AzRecoveryServicesAsrVaultContext -Vault $vault $fabrics = Get-AzRecoveryServicesAsrFabric foreach ($fabric in $fabrics) { Write-Host "正在处理Fabric: $($fabric.Name)" $containers = Get-AzRecoveryServicesAsrProtectionContainer -Fabric $fabric foreach ($container in $containers) { Write-Host " 获取容器 $($container.Name) 的复制项" $replicationItems = Get-AzRecoveryServicesAsrReplicationProtectedItem -ProtectionContainer $container # 在这里可以添加处理复制项的逻辑,比如输出或保存 $replicationItems | Format-Table Name, ProtectionStatus } }
验证提示
你可以先运行Get-AzRecoveryServicesAsrFabric | Format-Table Name, Type查看所有fabric的名称和类型,确认要操作的目标fabric信息,避免选错对象。
内容的提问来源于stack exchange,提问作者Ashok Developer

