Skip to content

Instantly share code, notes, and snippets.

@DonovanDiamond
Last active December 16, 2023 08:39
Show Gist options
  • Save DonovanDiamond/fc001ec43ba4244c0af3e0c3cd8fcd07 to your computer and use it in GitHub Desktop.
Save DonovanDiamond/fc001ec43ba4244c0af3e0c3cd8fcd07 to your computer and use it in GitHub Desktop.
$ErrorActionPreference = "Stop"
function Log {
param (
$m
)
Write-Output "$("[{0:yyyy/MM/dd} {0:HH:mm:ss}]" -f (Get-Date)) $m"
}
$exportFolder = "D:\VM Exports"
function ExportVM {
param (
$vmName
)
$exportVMFolder = "$exportFolder\$vmName"
$backupFolder = "\\192.168.1.1\Backup\VM Exports\$vmName-$(Get-Date -Format "yyyy-MM-dd-HH-mm")"
Log "Using the following: `n Export Folder: $exportFolder `n Export VM Folder: $exportVMFolder `n Backup Folder: $backupFolder `n"
if (Test-Path -Path $exportVMFolder) {
Log "Deleting temp export folder that still exists..."
Remove-Item -Path $exportVMFolder -Force -Recurse
Log "Delete finished"
}
Log "Starting export to temp directory..."
$ExportJob = Export-VM -Name $vmName -Path "$exportFolder\" -AsJob;
sleep(10)
while ($ExportJob.State -eq "Running" -or $ExportJob.State -eq "NotStarted") {
Log "[Export $vmName] $($ExportJob.Progress.PercentComplete)% complete"
sleep(30)
}
if ($ExportJob.State -ne "Completed") {
Write-Error "Export Job did not complete: $($ExportJob.State)"
throw $ExportJob.Error
}
Log "Export finished."
Log "Starting copy to backup server..."
# Robocopy:
# /j - Copies using unbuffered I/O (recommended for large files).
# /e - Copies subdirectories. This option automatically includes empty directories.
# /eta - Show ETA of each file being copied.
# /np - Do not show percentage.
# /v - Verbose.
robocopy /j /e /eta /np /v $exportVMFolder $backupFolder
Log "Copy finished."
Log "Deleting temp export folder..."
Remove-Item -Path $exportVMFolder -Force -Recurse
Log "Delete finished"
}
ExportVM "Test VM"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment