首页 > 解决方案 > 从脚本中排除虚拟机列表删除 vmware 中的快照

问题描述

我有一个powercli计划删除VMs早于 X 天的脚本,最近我们得到了一个列表,VMs其中应该从快照删除中排除,因为这些是关键快照。如何VM在脚本中引入参数 exclude 以将VMSVcenter 中的快照与我提供的列表进行比较,并仅列出和删除VMS符合不超过 X 天且不属于排除列表的条件的VM列表。

我比较新,使用下面的代码来获取超过 10 天的快照并删除它们。

# vCenter Server configuration
   $vcenter = "Vcenter Name"
$vcenteruser = "Domain\Userid"
$vcenterpw = "Password"

#Connect to the vCenter server defined above. Ignore certificate errors
Connect to vcenter Server connect-viserver $vcenter -User $vcenteruser -Password $vcenterpw"


Add-PSSnapin VMware.VimAutomation.Core -ErrorAction 'SilentlyContinue'
Clear-Host
$old_snapshots = Get-VM | Get-Snapshot |? { ([DateTime]::Now - $_.Created).TotalDays -gt 7 } | Remove-Snapshot: $old_snapshots | Remove-Snapshot -RunAsync -Confirm:$false    

我需要弄清楚如果我有一个包含 10 天以上的快照的“vms”列表不应该被删除怎么办。我想排除那些“虚拟机”,但我不知道该怎么做。

所以我尝试使用@IT Delinquent 的逻辑。我在“$VmToIgnore”中输入了一个值,并将其与“Get-Vm”中收到的 VM 列表进行比较。如果为真则什么都不做,如果为假,则获取该 VM 的快照和其他属性并将其导出为 CSV。

$vmsToIgnore ="Vm1"
$e = Get-VM
    Foreach-Object {
    if ($vmsToIgnore -Contains $_.Name){  
        #Do nothing as VM name is in the vmsToIgnore list
    }else{

          $f = $e |get-Snapshot| Select-object 
         vm,VMId,name,Description,SizeGB,created

         $f| Export-Csv -Path "\\%path%\snapshot.csv"
    }
}

这仍然返回所有“VM”快照的列表,包括一个“$VMToIgnore”。

我一定在这里犯了一些错误,因为它不应该在 Excel 中打印“$VmToIgnore”。

标签: powercli

解决方案


听起来您已经将 VM 名称作为列表,在这种情况下排除它们

$list = 获取虚拟机 | 其中{“名称”-ne“mypreciousvm”}

您将需要使用 -notmatch 或 -notcontains 我不记得您需要哪个。然后通过下面的排除列表。

$old_snapshots = 获取虚拟机名称 $list | 获取快照|?{ ([DateTime]::Now - $_.Created).TotalDays -gt 7 } | 删除快照:$old_snapshots | 删除快照 -RunAsync -Confirm:$false

如果虚拟机来来去去很多,那么请尝试一次性完成,否则在重新获取虚拟机名称时可能会出现错误

$old_snapshots = 获取虚拟机 | 其中 {$ .name -notcontains $list}| 获取快照|?{ ([DateTime]::Now - $ .Created).TotalDays -gt 7 } | 删除快照:$old_snapshots | 删除快照 -RunAsync -Confirm:$false


推荐阅读