functions/Restore-VmSnapshot.ps1

function Checkpoint-Vm
{
    [CmdletBinding(SupportsShouldProcess, ConfirmImpact = 'Low')]
    param
    (
        [Parameter(Mandatory, ParameterSetName = 'NameName', ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [Parameter(Mandatory, ParameterSetName = 'NameStart', ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [Parameter(Mandatory, ParameterSetName = 'NameSuspend', ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [Parameter(Mandatory, ParameterSetName = 'NameCurrent', ValueFromPipeline, ValueFromPipelineByPropertyName)]
        [string[]]
        $ComputerName,

        [Parameter(Mandatory, ParameterSetName = 'ObjectName', ValueFromPipeline)]
        [Parameter(Mandatory, ParameterSetName = 'ObjectStart', ValueFromPipeline)]
        [Parameter(Mandatory, ParameterSetName = 'ObjectSuspend', ValueFromPipeline)]
        [Parameter(Mandatory, ParameterSetName = 'ObjectCurrent', ValueFromPipeline)]
        [PoshLibVirt.VirtualMachine[]]
        $Computer,

        [Parameter(Mandatory, ParameterSetName = 'NameName')]
        [Parameter(Mandatory, ParameterSetName = 'ObjectName')]
        [Parameter(Mandatory, ParameterSetName = 'NameStart')]
        [Parameter(Mandatory, ParameterSetName = 'ObjectStart')]
        [Parameter(Mandatory, ParameterSetName = 'NameSuspend')]
        [Parameter(Mandatory, ParameterSetName = 'ObjectSuspend')]
        [string]
        $Name,

        [Parameter(Mandatory, ParameterSetName = 'NameCurrent')]
        [Parameter(Mandatory, ParameterSetName = 'ObjectCurrent')]
        [switch]
        $Current,

        [Parameter(ParameterSetName = 'NameSuspend')]
        [Parameter(ParameterSetName = 'ObjectSuspend')]
        [switch]
        $Suspend,

        [Parameter(ParameterSetName = 'NameStart')]
        [Parameter(ParameterSetName = 'ObjectStart')]
        [switch]
        $Start,

        [Parameter(ParameterSetName = 'NameName')]
        [Parameter(ParameterSetName = 'ObjectName')]
        [Parameter(ParameterSetName = 'NameStart')]
        [Parameter(ParameterSetName = 'ObjectStart')]
        [Parameter(ParameterSetName = 'NameSuspend')]
        [Parameter(ParameterSetName = 'ObjectSuspend')]
        [Parameter(ParameterSetName = 'NameCurrent')]
        [Parameter(ParameterSetName = 'ObjectCurrent')]
        [switch]
        $Force
    )

    process
    {
        if (-not $Computer)
        {
            $Computer = foreach ($vmName in $ComputerName)
            {
                Get-Vm -ComputerName $vmName
            }
        }

        foreach ($machine in $Computer)
        {
            if (-not $PSCmdlet.ShouldProcess($machine.Name, (Get-PSFLocalizedString -Module PoshLibVirt -Name Verbose.Restore)))
            {
                continue
            }

            $cmdLine = @(
                'snapshot-revert'
                "--domain $($machine.Name)"
                if ($Name) { "--snapshotname $Name" }
                if ($Current.IsPresent) { '--current' }
                if ($Start.IsPresent) { '--running' }
                if ($Suspend.IsPresent) { '--paused' }
                if ($FOrce.IsPresent) { '--force' }
            )

            Start-Process -FilePath virsh -ArgumentList $cmdLine -Wait
        }
    }
}