我有一个powercli
脚本,该脚本计划删除X天之前的VMs
,最近我们得到了VMs
的列表,这些列表应该从快照删除中排除,因为这些是关键快照。
如何在脚本中引入参数排除VM
以将VMS
和Vcenter中的快照与我提供的列表进行比较,并仅列出和删除符合不老标准的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'列表,不应删除。我想排除那些“ Vms”,但是我不确定该怎么做。
因此,我尝试使用@ I.T Delinquent的“使用逻辑”。我在“ $ VmToIgnore”中输入了一个值,并将其与“ Get-Vm”中收到的虚拟机列表进行比较。如果为true,则不执行任何操作;如果为false,则获取该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”快照的列表,包括n个“ $ VMToIgnore”。
我肯定在这里犯了一个错误,因为它不应该在Excel中打印'$ VmToIgnore'。
答案 0 :(得分:0)
您可以基于这样的东西吗?
$vmsToIgnore = "VM1","VM2"
$old_Snapshots = Get-VM | Foreach-Object {
if ($vmsToIgnore -Contains $_.Name){
#Do nothing as VM name is in the vmsToIgnore list
}else{
#Perform tasks as vm isn't in vmsToIgnore list
}
}
我不太确定Get-VM将返回什么,所以请您可能需要编辑我的示例。尽管假设Get-VM返回了一个不错的VM列表,但这是它的基础:
$vmsToIgnore = "VM1","VM2"
$outputFromGetVM = "VM1","VM1.2","VM2","VM3"
foreach ($vm in $outputFromGetVM){
if ($vmsToIgnore -contains $vm){
Write-Host "Ignoring"
}else{
Write-Host "performing"
}
}
如果您有任何疑问,请告诉我
更新
我认为可以使用:
$vmsToIgnore = "Vm1"
Get-VM | ForEach-Object {
if ($vmsToIgnore -contains $_.Name){
#Do nothing as VM name is in the vmsToIgnore list
}else{
Get-Snapshot $_ | Select-Object vm, VmId, Name, Description, SizeGB, Created | Export-Csv -Path "\\path\to\file.csv"
}
}
答案 1 :(得分:0)
像您这样的声音已经将虚拟机名称作为列表了,在这种情况下,请排除它们
$ list =获取VM |其中{“ name” -ne“ mypreciousvm”}
您将需要玩-notmatch或-notcontains,我不记得您需要哪一个。然后通过下面的排除列表。
$ old_snapshots =获取VM-名称$ list |获取快照|? {([[DateTime] :: Now-$ _。Created).TotalDays -gt 7} |删除快照:$ old_snapshots | Remove-Snapshot -RunAsync -Confirm:$ false
如果Vms来来往往,则尝试一次完成,否则在重新获得虚拟机名称时可能会出错
$ old_snapshots =获取VM |其中{$ .name -notcontains $ list} |获取快照|? {([[DateTime] :: Now-$ .Created).TotalDays -gt 7} |删除快照:$ old_snapshots | Remove-Snapshot -RunAsync -Confirm:$ false
答案 2 :(得分:0)
删除3天之前的快照
Get-VM | Get-Snapshot | ? {$_.created -lt (Get-Date).AddDays(-3)} | Remove-Snapshot -Confirm:$false -RunAsync