Bulk Merge aller AVHDX-Snapshots einer VM

Eine VM, 5 Platten, 1.000 AVHDX-Daten. Diverse Snapshots, die einfach hängen geblieben sind, und niemanden ist es aufgefallen. Zwar habe ich unter Snapshots händisch mergen schon einen Artikel, wie man das händisch macht, aber bei mehreren VMs und mehreren VHD(X)-Dateien nervt das hammer.

Folgendes Powershell-Script fixt das, indem es alle Platten einer VM durchläuft und für jede die AVHDX-Dateien immer weiter reinmergt bis keine mehr da sind:

# Wenn das `-Name "DC"` weggestrichen wird, wird das oben für alle VMs gemacht
$VMs = Get-VM -Name "DC"

foreach ($VM in $VMs) {
    Write-Host "Bearbeite VM: $($VM.Name)" -ForegroundColor Cyan

    $HardDrives = Get-VMHardDiskDrive -VMName $VM.Name

    foreach ($Drive in $HardDrives) {
        $DiskPath = $Drive.Path

        # Infos zu dieser einen Disk ziehen
        $DiskInfo = Get-VHD -Path $DiskPath
        while ($DiskInfo.VhdType -eq 'Differencing') {
            Write-Host "Merge: $($DiskInfo.Path)" -ForegroundColor Yellow
            try {
                Merge-VHD -Path $DiskInfo.Path -Force
                # Zu der übergeordneten Disk springen und wieder zu Anfang
                # der Schleife
                $DiskInfo = Get-VHD -Path $DiskInfo.ParentPath
            } catch {
                Write-Host "Fehler beim Merge: $($DiskInfo.Path) - $_" -ForegroundColor Red
                break
            }
        }

        # Hier angekommen sind wir entweder mit dem Mergen aller Platten durch
        # -oder- es trat ein Fehler auf, und hier wird die letzte Platte
        # ausgegeben
        Write-Host "Finale VHD(x): $($DiskInfo.Path)" -ForegroundColor Green
    }
}
Code language: PowerShell (powershell)

Kategorien:HyperVPowershell