Src/LabVMSnapshot.ps1
function RemoveLabVMSnapshot { <# .SYNOPSIS Removes a VM snapshot. #> [CmdletBinding(SupportsShouldProcess)] param ( [Parameter(Mandatory, ValueFromPipeline)] [ValidateNotNullOrEmpty()] [System.String[]] $Name, [Parameter(ValueFromPipelineByPropertyName)] [ValidateNotNullOrEmpty()] [System.String] $SnapshotName = '*' ) process { <## TODO: Add the ability to force/wait for the snapshots to be removed. When removing snapshots it take a minute or two before the files are actually removed. This causes issues when performing a lab reset #> foreach ($vmName in $Name) { # Sort by descending CreationTime to ensure we will not have to commit changes from one snapshot to another Get-VMSnapshot -VMName $vmName -ErrorAction SilentlyContinue | Where-Object Name -like $SnapshotName | Sort-Object -Property CreationTime -Descending | ForEach-Object { WriteVerbose -Message ($localized.RemovingSnapshot -f $vmName, $_.Name); Remove-VMSnapshot -VMName $_.VMName -Name $_.Name -Confirm:$false; } } #end foreach VM } #end process } #end function RemoveLabVMSnapshot function NewLabVMSnapshot { <# .SYNOPSIS Creates a snapshot of all virtual machines with the specified snapshot name. #> [CmdletBinding()] param ( [Parameter(Mandatory, ValueFromPipeline)] [ValidateNotNullOrEmpty()] [System.String[]] $Name, [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [ValidateNotNullOrEmpty()] [System.String] $SnapshotName ) process { foreach ($vmName in $Name) { WriteVerbose -Message ($localized.SnapshottingVirtualMachine -f $vmName, $SnapshotName); Checkpoint-VM -VMName $vmName -SnapshotName $SnapshotName; } #end foreach VM } #end process } #end function NewLabVMSnapshot function GetLabVMSnapshot { <# .SYNOPSIS Gets snapshots of all virtual machines with the specified snapshot name. #> [CmdletBinding()] param ( ## VM/node name. [Parameter(Mandatory, ValueFromPipeline)] [ValidateNotNullOrEmpty()] [System.String[]] $Name, ## Snapshot name to restore. [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [ValidateNotNullOrEmpty()] [System.String] $SnapshotName ) process { foreach ($vmName in $Name) { $snapshot = Get-VMSnapshot -VMName $vmName -Name $SnapshotName -ErrorAction SilentlyContinue; if (-not $snapshot) { WriteWarning -Message ($localized.SnapshotMissingWarning -f $SnapshotName, $vmName); } else { Write-Output -InputObject $snapshot; } } #end foreach VM } #end process } #end function GetLabVMSnapshot |