VMware alle Snapshots einer VM löschen mit Powershell

Diese Funktion in VMware vSphere "Snapshot erstellen" ist auch zu verlockend und VMware Administratoren kennen das Problem, dass jemand "nur kurz" einen Snapshot einer VM benötigt. 

Wer die Snapshots nicht regelmäßig löscht, hat also irgendwann viele VMs mit Snapshots, die gelöscht werden müssen. Wer also nicht per Hand alle VMs anklicken will, um die Snapshots zu löschen, kann sich auch mit Powershell (bzw. der VMware PowerCLI) helfen. 

VMware Snapshots mit der Powershell löschen

Mit diesem Powershell Script lassen sich alle Snapshots von definierten VMs löschen.

 


##############################
#
# Lösche alle Snapshots einer oder mehreren VMware VM 
# PowerCLI bzw. das Powershell-Snapin muss vorhanden sein
#
##############################
 
$VCenterServer = "/*FQDN of vCenter*/"
$VCenterUser = "DOMAIN\USERNAME"
$DestinationDir = "X:\PATH\OF\DESTINATION\VMRC"


Write-Output "Script started $(Get-Date)"  

 
# Check VMware PSSnapin  
If ( (Get-PSSnapin VMware.VimAutomation.Core -ErrorAction SilentlyContinue) -eq $null) {  
    write-output "Loading PSSnapin"
    Add-PSSnapin VMware.VimAutomation.Core  
}  else {
    Write-Output "PSSnapin already loaded" -f green
}


$connectionSucceeded = 0
if ($connectionSucceeded -eq 0) {
    try {
        $connectViServer = Connect-VIServer $VCenterServer -User $VCenterUser -ErrorAction SilentlyContinue
        $ErrorMessage = ""
    }
    catch {
        $ErrorMessage = "ErrorMessage: "+$Error[0]
    }
    finally {
        if ($connectViServer -eq $NULL) {
            write-host "Login failed`n" -f red
            $connectionSucceeded = 0
        } else {
            $connectionSucceeded = 1
            write-host "Login successfull`n" -f green
        
        }
    }

}




$VMnameArray = @("vm-01","vm-02", "vm-02", "vm-04") #Hier die Namen der VMs angeben
foreach ($VMname in $VMnameArray) { 
    write-host "`n$VMname"

    $SnapshotVMArray = @()
    $snap = "" 
    $errors = 0 #Errorcounter muss 0 sein, damit die Aktion (löschen) letztendlich ausgeführt werden kann.

    $SnapshotVMArray = Get-vm -Name $VMname | get-snapshot  #| format-list vm,name,created

    if ($SnapshotVMArray.count -gt 0) {
        write-host "Es sind Snapshots vorhanden" -f DarkMagenta
    } else {
        write-host "Es sind keine Snapshots vorhanden." -f Green
        $errors++;
    }
    
    #Wenn Snapshots vorhanden sind...
    if ($errors -eq 0) {
        foreach ($SnapshotVMElement in $SnapshotVMArray) {
            #Bisschen was zum Debuggen
            #$SnapshotVMElement.Name
            #$SnapshotVMElement.VM
            #$SnapshotVMElement.Created

            try {
                $snap = Get-Snapshot -vm $SnapshotVMElement.VM -name $SnapshotVMElement.Name -ErrorAction SilentlyContinue #Wenn kein Snapshot mehr da ist, kommt ein Error, den blende ich aber aus
            }

            catch {
                write-host "Irgendwas stimmt nicht" -f Red
            }
         
            finally {
                #Wenn dieser Punkt erreicht wird, ist ein Snapshot vorhanden
                write-host "Finally..." -f yellow

                if ($snap.count -eq 0) {
                    write-host "Keine Snapshots (mehr) vorhanden." -f Yellow
            
                } else {
                    write-host "Snapshot vorhanden...also löschen" -f Yellow
                    write-host "Lösche Snapshot..."
                    write-host "VM: $($SnapshotVMElement.VM) Name: $($SnapshotVMElement.name) Created: $($SnapshotVMElement.Created)" -f Cyan
                    sleep 5 #Zeit um nochmal alles zu stoppen
                    Remove-Snapshot -Snapshot $snap -Confirm:$false -RunAsync:$false –RemoveChildren

                }


            }


        }
    }



}



 

VMware vCenter Version und Build finden: VMware vCenter Version und Build finden

VMRC Shortcuts erstellen, um den Usern einen einfacheren Weg zu deren VMs zu bieten?: VMware VMRC Shortcuts mit Powershell erstellen