如何修改PowerShell脚本异步删除Azure恢复服务保管库所有备份项
批量异步删除Azure恢复服务保管库备份项(PowerShell 5兼容)
问题原因
Disable-AzRecoveryServicesBackupProtection cmdlet在适配PowerShell 5的旧版Az模块中未实现-AsJob参数,直接使用会报错。我们可以用PowerShell原生的Start-Job命令封装删除操作,实现异步发起批量删除请求。
修改后的脚本
## Variables $rgBackup = Read-Host -Prompt "Resource group name" $vaultName = Read-Host -Prompt "Recovery service vault name" $vault = Get-AzRecoveryServicesVault -ResourceGroupName $rgBackup -Name $vaultName $count = 0 $jobs = @() # 用于存储异步任务对象,可选用于后续跟踪状态 ## ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ## Disable soft delete for the Azure Backup Recovery Services vault Set-AzRecoveryServicesVaultProperty -Vault $vault.ID -SoftDeleteFeatureState Disable Write-Host ("`n # Soft delete disabled for Recovery Service vault " + $vault.Name) ## ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ## Check if there are backup items in a soft-deleted state and reverse the delete operation $containerSoftDelete = Get-AzRecoveryServicesBackupItem -BackupManagementType AzureWorkload -WorkloadType MSSQL -VaultId $vault.ID | Where-Object {$_.DeleteState -eq "ToBeDeleted"} foreach ($item in $containerSoftDelete) { Undo-AzRecoveryServicesBackupItemDeletion -Item $item -VaultId $vault.ID -Force -Verbose } Write-Host ("`n# Undeleted all backup items in a soft deleted state in Recovery Services vault " + $vault.Name) ## ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ## Stop protection and delete data for all backup-protected items (异步版本) $containerBackup = Get-AzRecoveryServicesBackupItem -BackupManagementType AzureVM -WorkloadType AzureVM -VaultId $vault.ID | Where-Object {$_.DeleteState -eq "NotDeleted"} foreach ($item in $containerBackup) { # 用Start-Job封装删除操作,异步发起 $job = Start-Job -ScriptBlock { param($item, $vaultId) Disable-AzRecoveryServicesBackupProtection -Item $item -VaultId $vaultId -RemoveRecoveryPoints -Force -Verbose } -ArgumentList $item, $vault.ID $jobs += $job $count++ Write-Host "$count - 删除指令已发起,任务ID: $($job.Id)" } # 可选:等待所有异步任务完成(如果需要确认全部删除完成才结束脚本) # Write-Host "`n等待所有删除任务完成..." # Wait-Job -Job $jobs # Write-Host "所有删除任务已完成" Write-Host ("`n# 已为所有云备份项发起删除指令,Recovery Services vault: " + $vault.Name)
关键修改说明
- 新增
$jobs数组存储异步任务对象,方便后续跟踪任务状态(可选) - 用
Start-Job封装删除命令,通过-ArgumentList传递参数(job作用域独立,必须显式传参) - 输出调整为提示指令已发起,而非直接标注删除完成(异步操作在后台执行)
- 保留可选的
Wait-Job代码块,若需脚本等待所有删除操作完成再退出,可取消注释
注意事项
- 批量异步请求可能触发Azure限流,若遇报错,可在foreach循环中添加
Start-Sleep -Seconds 1控制请求频率 - 可用
Get-Job查看任务状态,Receive-Job获取任务输出日志
内容的提问来源于stack exchange,提问作者Fran Alcaraz
相关产品推荐
相关产品推荐

