Skip to content

Instantly share code, notes, and snippets.

@tomfanning
Last active March 23, 2019 02:20
Show Gist options
  • Save tomfanning/617bde27596de3b1ca62 to your computer and use it in GitHub Desktop.
Save tomfanning/617bde27596de3b1ca62 to your computer and use it in GitHub Desktop.
Backup Hyper-V VMs using save-vm, export-vm, result-vm with basic rotation
$ErrorActionPreference = "Stop"
# https://gist.github.com/tomfanning/617bde27596de3b1ca62
$backuptarget = "b:\HyperV"
$compression = $false
$VMs = Get-VM
foreach ($vm in $vms){
$vmname = $vm.Name
Write-Host "Exporting $vmname"
$vmtargetfolder = $backuptarget + "\" + $vmname
$vmPrevBackupFolder = $vmtargetfolder + "_prev"
# remove leftover previous backup folder
if (test-path $vmPrevBackupFolder){
remove-item -recurse -Force $vmPrevBackupFolder
}
# rename current backup folder to previous
if (test-path $vmtargetfolder){
rename-item $vmtargetfolder $vmPrevBackupFolder
}
$running = $false
if ($vm.state -eq "Running") {
# save RAM to disk and pause VM
save-vm -vm $vm
$running = $true
}
$success=$false
for($i=1; $i -le 3; $i++){
try {
# export running VM to current backup folder
export-vm -vm $vm -path $backuptarget
$success = $true
break
}
catch {
write-host "Retrying..."
remove-item -recurse -force $vmtargetfolder
}
}
if ($running) {
# resume from saved state
start-vm -vm $vm
}
if ($success -eq $false){
throw "Fatal error exporting VM after 3 retries: $_.Exception.Message"
}
# apply compression
if ($compression) {
write-host "Compressing..."
$cmd = "cmd /c compact /q /c /s:""$vmtargetfolder"""
cmd /c $cmd
}
# delete previous backup folder
if (test-path $vmPrevBackupFolder){
remove-item -recurse -Force $vmPrevBackupFolder
}
}
write-host "All done"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment