从脚本删除vmware中的快照中排除Vms列表

时间:2019-06-10 08:31:30

标签: powercli

我有一个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'。

3 个答案:

答案 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