检查某些虚拟机是否已备份

Check if certain VMs are backed up

我正在寻找一种方法来检查 VM 列表是否有备份以及状态如何。 我设法获取了 VM 备份的状态,但是如果在 $tasks 中找不到 VM,我就不会收到错误消息。 我需要知道 $tasks 中是否不存在虚拟机,以便我知道没有为此虚拟机配置备份。 到目前为止的脚本。

    Write-Host "Enter Backup Server" -ForegroundColor cyan
 

 
$h = read-host -Prompt 'Hostname'


Write-Host " "
write-host "Hostname--------Job-------------Status " -ForegroundColor Cyan
Foreach ($i in $Hostname) {
Invoke-Command -ComputerName $h -ScriptBlock {
Add-PSSnapin VeeamPSSnapin

 foreach($Job in (Get-VBRJob))
{
        $Session = $Job.FindLastSession()
        if(!$Session){continue;}
        $Tasks = $Session.GetTaskSessions()
        $Tasks | ?{$_.Name -eq $using:i} | %{write-host $_.Name ":",$_.JobName,"===>"$_.Status}
        
}}
}

提前致谢!

瓦莱里

你就快完成了,你只需要统一你的退出子句,这样无论虚拟机是否有备份,它都会输出类似的东西。然后,当您 运行 针对 VM 列表和一两个未备份时,它们将以有意义的方式出现在输出中。

Foreach ($i in $Hostname) {
    Invoke-Command -ComputerName $h -ScriptBlock {
        Add-PSSnapin VeeamPSSnapin

        foreach($Job in (Get-VBRJob))
        {
                $Session = $Job.FindLastSession()
                if(!$Session){
                    [pscustomObject]@{
                        computerName = $_.Name;
                        backupStatus = "Not backed up!";
                        jobs = $null;
                    }
                $Tasks = $Session.GetTaskSessions()
                $jobs = $Tasks | ?{  $_.Name -eq $using:i } | Select -ExpandProperty JobName
                
                [PSCustomObject]@{
                    computerName = $_.Name;
                    backupStatus = "Backed up";
                    jobs = ($jobs -join ",")
                }
        }
    }
}

通过一些小的调整,如果机器没有 $Session 的任何结果,我们现在会发回一个对象,但现在 return 有备份的机器也会发回一个类似的对象已启用。

您可能需要将代码调整为您想要的结果,因为我没有可用的 Veeam,我不能完全确定您想要什么,但这应该可以让您继续。

作为一项福利,取回 PowrShell 对象更容易使用。您可以将它们保存在 json 文件或 csv 中,或者 运行 这会在下班时间自动保存并稍后查看结果,所有这些都比使用 Write-Host 命令容易得多。

我通过将所有备份的 VM 与我列表中的 VM 进行配对来实现我的目标:

Write-host "Unprotected VMs (No backup)" -ForegroundColor RED
Write-host "---------------------------" -ForegroundColor RED
invoke-command -computername $h -ScriptBlock {
Add-PSSnapin VeeamPSSnapin
$backup=Get-VBRBackupSession | Where-Object {$_.JobType -eq "Backup" -or $_.JobType -eq "Replica" -and $_.EndTime}|foreach{$_.gettasksessions() | Where-Object {$_.Status -ne "Failed"}} |foreach{$_.Name} | Sort-Object | Get-Unique
$diff=Compare-Object $using:hostname $backup| ? { $_.SideIndicator -eq "<=" } | Select -ExpandProperty InputObject
$diff

因此,我只得到了 $backup 中缺少的虚拟机,并且只出现在我的列表 $hostnames 中。