PowerShell嵌套数组与循环实现Veeam备份恢复检查脚本优化
优化Veeam备份恢复检查脚本的数组设计与循环实现
一、推荐数据结构:自定义对象数组(替代嵌套数组)
嵌套数组可读性差,直接用自定义对象关联服务器、备份作业、磁盘信息更清晰,每个对象封装单台服务器的所有关联数据。
创建数据结构示例
# 初始化空数组存储服务器-磁盘映射 $serverDiskMap = @() # 手动添加服务器数据(实际可从Veeam自动提取) $serverDiskMap += [PSCustomObject]@{ ServerName = "ServerA" BackupJobs = @("Job1", "Job3") Disks = @("C:", "D:", "E:") } $serverDiskMap += [PSCustomObject]@{ ServerName = "ServerB" BackupJobs = @("Job2", "Job4") Disks = @("C:", "F:") } # 其他服务器依次添加...
二、循环处理逻辑:按服务器遍历,再遍历磁盘
先遍历每个服务器对象,处理完该服务器的所有磁盘后,再切换到下一台服务器,完全匹配你的需求。
循环实现示例
foreach ($server in $serverDiskMap) { Write-Host "=== 开始处理服务器: $($server.ServerName) ===" # 遍历当前服务器的所有磁盘 foreach ($disk in $server.Disks) { Write-Host "正在检查服务器 $($server.ServerName) 的磁盘: $disk" # 替换为你的Veeam恢复检查逻辑,示例: # 1. 查找对应备份点 # $restorePoints = Get-VBRBackup -Name $server.BackupJobs | Get-VBRRestorePoint -Name $server.ServerName -Disk $disk # 2. 执行恢复验证 # Test-VBRRestorePoint -RestorePoint $restorePoints } Write-Host "=== 服务器 $($server.ServerName) 所有磁盘处理完成 ===" Write-Host "" }
三、从Veeam作业自动提取数据(替代手动维护)
手动创建对象效率低,直接通过Veeam PowerShell命令自动聚合服务器、作业、磁盘信息:
# 获取目标备份作业 $targetJobs = Get-VBRJob -Name "Job1", "Job2", "Job3", "Job4", "Job5", "Job6", "Job7" # 按服务器分组,聚合所属作业与磁盘 $serverDiskMap = $targetJobs | ForEach-Object { $currentJob = $_ # 提取作业内的服务器及磁盘信息 $currentJob.GetObjectsInJob() | ForEach-Object { [PSCustomObject]@{ ServerName = $_.Name BackupJob = $currentJob.Name Disks = $_.GetDisks() | Select-Object -ExpandProperty Name } } } | Group-Object -Property ServerName | ForEach-Object { [PSCustomObject]@{ ServerName = $_.Name BackupJobs = $_.Group.BackupJob | Select-Object -Unique Disks = $_.Group.Disks | Select-Object -Unique } }
这段代码会自动合并跨多个作业的服务器数据,无需手动维护映射关系。
四、额外效率优化提示
- 预缓存Veeam对象:避免在循环内反复调用
Get-VBR*命令,先一次性把所有备份点、作业信息存入变量。 - 并行处理(可选):PowerShell 7+可使用
ForEach-Object -Parallel并行处理不同服务器,注意控制并发数避免触发Veeam限制。
内容的提问来源于stack exchange,提问作者PaulieW
相关产品推荐
相关产品推荐

