Functions/Backup-VM.ps1



function Backup-VM {
    [CmdletBinding()]
    param (
        [Parameter()] [string] $VMName,
        [Parameter()] [string] $Path = "D:\HV_backup",
        [Parameter()] [switch] $All
    )

    if ($VMName) {
        $vm = Get-VM $VMName
    } elseif ($All) {
        $vm = Get-VM
    } else {
        throw "No VM specified, use parameter VMName or -All"
    }

    $i = 0
    foreach ($v in $vm) {
        $i++
        $date = Get-Date
        $DateTimeString = "$($date.Year)$($date.Month)$($date.Day)_$($date.Hour)$($date.Minute)$($date.Second)"

        $FullBackupPath = Join-Path $Path "$($DateTimeString)_$($v.Name)"

        Write-Progress "Exporting $($v.Name) to path $($FullBackupPath)" -Status "$($i) of $(($vm).count)"
        Export-VM -VM $v -Path $FullBackupPath

    }

}


$scriptblock = {
    param($commandName, $parameterName, $wordToComplete, $commandAst, $fakeBoundParameters)
    $o = Get-VM | Where-Object { $_.Name -like "$wordToComplete*" }
    $o.Name | ForEach-Object {
        if ($_ -match " ") {
            "'$_'"
        } else {
            $_
        }
    }
}
Register-ArgumentCompleter -CommandName Backup-VM -ParameterName VMName -ScriptBlock $scriptblock