0

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

    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}
        
}}
}

提前致谢!

瓦莱里

4

2 回答 2

0

你快到了,你只需要统一你的退出子句,这样无论虚拟机是否有备份,它都会输出类似的东西。然后,当您针对 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返回一个对象,但现在也为启用了备份的机器返回一个类似的对象。

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

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

于 2021-04-01T02:26:07.867 回答
0

我设法通过将所有备份的 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 中。

于 2021-04-08T08:56:06.013 回答