【问题标题】:Check if certain VMs are backed up检查某些虚拟机是否已备份
【发布时间】:2021-06-28 00:48:51
【问题描述】:

我正在寻找一种方法来检查虚拟机列表是否有备份以及状态如何。 我设法获得了虚拟机备份的状态,但如果在 $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}
        
}}
}

提前致谢!

瓦莱里

【问题讨论】:

  • 你如何将任何东西传递给你的 $Hostname 变量?
  • 从 .txt 文件中获取内容。该文件包含每个新行上的主机名。

标签: powershell veeam


【解决方案1】:

你快到了,你只需要统一你的退出子句,这样无论虚拟机是否有备份,它都会输出类似的东西。然后,当您针对 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 命令容易得多。

【讨论】:

  • 您好 FoxDeploy!非常感谢你的帮助。不幸的是,我仍然有点卡住。我无法获取 pscustomeobject 的内容。我已经从两个 PS 自定义对象创建了我的对象,但是当我尝试查看其中的内容时,我什么也没得到。我使用: $bkp=[PSCustomObject]@{ computerName = $_.Name; backupStatus = "已备份"; jobs = ($jobs -join ",") } Write-Host ($bkp | ft | Out-String) 也尝试了 $bkp.computername 但我也没有得到任何东西。
  • 使用 Write-Output 而不是 Write-Host,因为 Write-Host 会去除格式,并且只应在人眼查看终端时使用
  • Write-Output 也不返回任何内容。或者,如果我可以从我的初始脚本中计算备份的虚拟机($using:i),它将会是足够的。所以我可以通过备份来计算所有虚拟机的数量,并知道是否没有备份的虚拟机。不幸的是,我尝试了几件事,但没有成功。试图增加变量 $v++ 你能给我一些提示吗?非常感谢!
【解决方案2】:

我通过将所有备份的虚拟机与我列表中的虚拟机进行比较来实现我的目标:

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 中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-09
    • 1970-01-01
    • 2022-08-02
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多