Powershell 检查是否备份了某些虚拟机
我正在寻找一种方法来检查虚拟机列表是否有备份以及状态如何。 我设法获得了VM备份的状态,但是如果在$tasks中找不到VM,我不会得到错误。 我需要知道$tasks中是否没有虚拟机,以便知道没有为此虚拟机配置备份。 到目前为止,剧本还没有完成Powershell 检查是否备份了某些虚拟机,powershell,veeam,Powershell,Veeam,我正在寻找一种方法来检查虚拟机列表是否有备份以及状态如何。 我设法获得了VM备份的状态,但是如果在$tasks中找不到VM,我不会得到错误。 我需要知道$tasks中是否没有虚拟机,以便知道没有为此虚拟机配置备份。 到目前为止,剧本还没有完成 Write-Host "Enter Backup Server" -ForegroundColor cyan $h = read-host -Prompt 'Hostname' Write-Host "
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}
}}
}
提前谢谢
Valeri您就快到了,您只需要统一exit子句,这样无论VM是否有备份,它都会输出类似的内容。然后,当您针对一个VM列表运行时,一个或两个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
命令容易得多。我通过将所有备份的虚拟机与我列表中的虚拟机进行比较,实现了我的目标:
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
写入主机“未受保护的虚拟机(无备份)”-ForegroundColor红色
写入主机“-------------------------------”ForegroundColor红色
调用命令-computername$h-ScriptBlock{
将PSSnapin添加到管理单元
$backup=Get VBRBackupSession |其中对象{$$\.JobType-eq“backup”-或$\.JobType-eq“Replica”-和$\.EndTime}foreach{$\.gettaskssessions()|其中对象{$\.Status-ne“Failed”}foreach{$\.Name}排序对象|获取唯一
$diff=Compare Object$,使用:hostname$backup |?{$\.SideIndicator-eq"如何将任何内容传递给$Hostname
变量?从.txt文件获取内容。该文件包含新行中的每个主机名。您好,FoxDeploy!非常感谢您的帮助。不幸的是,我仍然有点卡住。我无法获取pscustomeobject的内容。我已经为两个PS自定义对象创建了对象,但当我y要查看其中的内容,我没有得到任何信息。我使用:$bkp=[PSCustomObject]@{computerName=$\uU4.Name;backupStatus=“Backed up”;jobs=($jobs-join“,”)}写主机($bkp | ft | Out String)还尝试了$bkp.computername,但我也没有得到任何结果。请使用写入输出
而不是写入主机
,因为写入主机带格式,并且仅应在人眼查看终端时使用。写入输出也不会返回任何内容。或者,如果我可以计算备份的VM($using:I),它将被启用从我的初始脚本。因此,我可以计算所有虚拟机的数量与备份的虚拟机,并知道是否没有备份的虚拟机。不幸的是,我尝试了几种方法,但没有成功。尝试增加变量$v++您能给我一些提示吗?非常感谢!