检查某些虚拟机是否已备份
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 中。
我正在寻找一种方法来检查 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 中。