Created
July 16, 2026 19:02
-
-
Save nosmall/da4d15acb25cecf21142c3e2982409b4 to your computer and use it in GitHub Desktop.
Komprese VHDX disků
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| # 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