使用Start-Job调用Restore-AzRecoveryServicesBackupItem时类型绑定失败求助
解决Start-Job中Azure恢复点对象类型转换失败的问题
问题原因
使用Start-Job异步执行恢复操作时,传递的恢复点对象会被PowerShell序列化处理,生成Deserialized.Microsoft.Azure.Commands.RecoveryServices.Backup.Cmdlets.Models.AzureVmRecoveryPoint类型的对象。虽然原始的AzureVmRecoveryPoint是RecoveryPointBase的派生类,但反序列化后的对象丢失了类型继承的元数据,导致Restore-AzRecoveryServicesBackupItem无法识别它为有效的参数类型。
解决方案
核心思路是不直接传递恢复点对象,而是传递其唯一标识ID,在Job内部重新获取原始的恢复点对象,同时在Job进程中重新设置Azure恢复服务Vault的上下文。
修改后的完整代码:
$recoveryPoints = Get-AzRecoveryServicesBackupRecoveryPoint ` -Item $backupItem ` -StartDate ( (Get-Date).AddDays(-1).ToUniversalTime() ) ` -EndDate ( (Get-Date).ToUniversalTime() ) # 提取恢复点、备份项和Vault的ID,用于Job内部查询 $rpId = $recoveryPoints[0].RecoveryPointId $backupItemId = $backupItem.BackupItemId $vaultId = (Get-AzRecoveryServicesVault).Id $scriptBlock = { try { # Job进程是独立会话,必须重新设置Vault上下文 Set-AzRecoveryServicesVault -Id $args[3] # 根据ID重新获取备份项和恢复点的原始对象 $targetBackupItem = Get-AzRecoveryServicesBackupItem -BackupItemId $args[1] $targetRp = Get-AzRecoveryServicesBackupRecoveryPoint -Item $targetBackupItem -RecoveryPointId $args[0] $restoreJob = Restore-AzRecoveryServicesBackupItem ` -RecoveryPoint $targetRp ` -TargetResourceGroupName $args[2] ` -StorageAccountName $args[4].Name ` -StorageAccountResourceGroupName $args[4].ResourceGroupName Wait-AzRecoveryServicesBackupJob -Job $restoreJob -Timeout 3600 } catch { Throw "$_" } } # 传递ID和其他参数到Job $asyncJob = Start-Job -ScriptBlock $scriptBlock -ArgumentList $rpId, $backupItemId, $rgName, $vaultId, $storageAccount
关键说明
- 重新设置Vault上下文:
Start-Job启动的进程不会继承当前会话的Azure配置,必须用Set-AzRecoveryServicesVault重新关联目标Vault。 - 用ID替代对象传递:字符串类型的ID在序列化时不会丢失类型信息,Job内部通过ID查询得到的是Cmdlet可识别的原始对象。
- 简单参数直接传递:资源组名称、存储账户的属性(如Name、ResourceGroupName)都是简单类型,可直接传入Job。
内容的提问来源于stack exchange,提问作者ryansin
相关产品推荐
相关产品推荐

