Public/Invoke-Power.ps1

<#
    .DESCRIPTION
    Use to alter VM Power states and reboot VM's.
 
    .PARAMETER PowerCycleVM
    Specifies the VM should be Power Cycled
 
    .PARAMETER RestartGuest
    Specifies the VM guest should be restarted
 
    .PARAMETER PowerOffGuest
    Specifies the VM guest should be Powered off
 
    .PARAMETER PowerOffVM
    Specifies the VM should be Powered off
 
    .PARAMETER PowerOnVM
    Specifies the VM should be Powered on
 
    .PARAMETER VM
    Specifies the VM Name
 
    .EXAMPLE
    Invoke-Power -restartguest -VM vmname
 
    Gracefully Restart the Guest
 
    .EXAMPLE
    Invoke-Power -poweroffguest -VM vmname
 
    Gracefully shutdown the Guest
 
    .EXAMPLE
    Invoke-Power -powercycle -VM vmname
 
    Hard Power Cycle VM
 
    .EXAMPLE
    Invoke-Power -poweroff -VM vmname
 
    Hard Power Off Vm
 
    .EXAMPLE
    Invoke-Power -poweron -VM vmname
 
    Hard power on VM
 
    .NOTES
    Requires the VMware.PowerCLI Module
 
    .Link
    https://github.com/TheTaylorLee/AdminToolbox
#>


function Invoke-Power {

    [CmdletBinding()]
    Param (
        [Parameter(Mandatory = $true, ParameterSetName = 'Power Cycle VM')][switch]$powercyclevm,
        [Parameter(Mandatory = $true, ParameterSetName = 'Restart Guest')][switch]$restartguest,
        [Parameter(Mandatory = $true, ParameterSetName = 'Power Off Guest')][switch]$poweroffguest,
        [Parameter(Mandatory = $true, ParameterSetName = 'Power Off VM')][switch]$poweroffvm,
        [Parameter(Mandatory = $true, ParameterSetName = 'Power On VM')][switch]$poweronvm,
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'Power Cycle VM')]
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'Restart Guest')]
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'Power Off Guest')]
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'Power Off VM')]
        [Parameter(Mandatory = $true, ValueFromPipeline = $true, ParameterSetName = 'Power On VM')]
        $VM
    )

    if ($powercyclevm) {
        Restart-VM -VM $VM -RunAsync -Confirm:$true
    }

    if ($restartguest) {
        Restart-VMGuest -VM $VM -Confirm:$false
    }

    if ($poweroffguest) {
        Shutdown-VMGuest -VM $VM -Confirm:$false
    }

    if ($poweroffvm) {
        Stop-VM -VM $vm -RunAsync -Confirm:$true
    }

    if ($poweronvm) {
        Start-VM -VM $VM -RunAsync -Confirm:$false
    }
}