Skip to content

Instantly share code, notes, and snippets.

@nosmall
Created July 16, 2026 19:02
Show Gist options
  • Select an option

  • Save nosmall/da4d15acb25cecf21142c3e2982409b4 to your computer and use it in GitHub Desktop.

Select an option

Save nosmall/da4d15acb25cecf21142c3e2982409b4 to your computer and use it in GitHub Desktop.
Komprese VHDX disků
# Vyžaduje spuštění PowerShellu jako Administrátor
if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
Write-Warning "Tento skript musí být spuštěn s administrátorskými právy. Spusťte PowerShell jako Správce."
break
}
Write-Host "Zahajuji BEZPEČNOU kompresi VHD/VHDX disků..." -ForegroundColor Cyan
# Získání všech virtuálních serverů
$vms = Get-VM
foreach ($vm in $vms) {
Write-Host "=================================================="
Write-Host "Zpracovávám virtuální server: $($vm.Name)" -ForegroundColor Yellow
# BEZPEČNOSTNÍ KONTROLA 1: Má VM nějaké checkpointy (snímky)?
$snapshots = Get-VMSnapshot -VMName $vm.Name
if ($snapshots.Count -gt 0) {
Write-Host " [VAROVÁNÍ] Tento server má aktivní Checkpointy (snímky)!" -ForegroundColor Red
Write-Host " Z bezpečnostních důvodů (hrozí poškození řetězce disků) server přeskakuji." -ForegroundColor Red
continue
}
$disks = Get-VMHardDiskDrive -VMName $vm.Name
if ($disks.Count -eq 0) {
Write-Host " [INFO] Žádné disky nenalezeny. Přeskakuji..."
continue
}
# Zaznamenání původního stavu
$originalState = $vm.State
Write-Host " Původní stav serveru: $originalState"
# Pokud server běží, uspíme ho (Save State). Pokud je vypnutý, neděláme nic.
if ($originalState -eq 'Running') {
Write-Host " [INFO] Server běží. Bezpečně ho uspávám (Save-VM)..."
Save-VM -Name $vm.Name -ErrorAction Stop
} elseif ($originalState -eq 'Off') {
Write-Host " [INFO] Server je vypnutý. Bude provedena komprese a zůstane vypnutý."
}
# Zpracování samotných disků
foreach ($disk in $disks) {
$path = $disk.Path
if (Test-Path $path) {
Write-Host " [AKCE] Optimalizuji disk: $path" -ForegroundColor White
try {
# Mode Full znamená maximální uvolnění místa. Bezpečné, dotkne se jen prázdného prostoru.
Optimize-VHD -Path $path -Mode Full -ErrorAction Stop
Write-Host " [OK] Optimalizace dokončena: $path" -ForegroundColor Green
} catch {
Write-Host " [CHYBA] Nelze optimalizovat (pravděpodobně jde o disk s pevnou velikostí/Fixed): $($_.Exception.Message)" -ForegroundColor DarkYellow
}
} else {
Write-Host " [CHYBA] Soubor disku nebyl na cestě nalezen: $path" -ForegroundColor Red
}
}
# Návrat do původního stavu - SPUSTÍ SE JEN POKUD PŮVODNĚ BĚŽEL
if ($originalState -eq 'Running') {
Write-Host " [INFO] Obnovuji běh virtuálního serveru (Start-VM)..."
Start-VM -Name $vm.Name
} else {
Write-Host " [INFO] Server nebyl původně zapnutý ($originalState). Ponechávám ho v aktuálním stavu."
}
}
Write-Host "=================================================="
Write-Host "Všechny operace byly bezpečně dokončeny." -ForegroundColor Cyan
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment