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