Public/Invoke-PowerState.ps1

<#
    .DESCRIPTION
    Modify the powerstate of one or more VMs at once. This command can also be used to discover the statuses.
 
    .PARAMETER Force
    Used to force the shutdown of VMs. Not recommended unless you are aware of the risks involved.
 
    .PARAMETER Restart
    Specifies Restarting the VM or VMs
 
    .PARAMETER Shutdown
    Specifies Shutting Down the VM or VMs
 
    .PARAMETER Start
    Specifies Starting the VM or VMs
 
    .PARAMETER Status
    Specifies showing the status of the VM or VMs
 
    .EXAMPLE
    Invoke-Powerstate -Shutdown -Force
 
    Specifies the selected VM's will be shutdown forcefully
 
    .EXAMPLE
    Invoke-Powerstate -Restart
 
    Specifies the selected VM's will be restarted
 
    .EXAMPLE
    Invoke-Powerstate -Start
 
    Specifies the selected VM's will be Started
 
    .EXAMPLE
    Invoke-Powerstate -status
 
    Specifies the discover of VM statuses
 
    .NOTES
    Requires the AZ module be installed, imported, and Connected.
 
    .Link
    https://github.com/TheTaylorLee/AdminToolbox
#>


Function Invoke-PowerState {

    [CmdletBinding()]
    Param (
        [Parameter(Mandatory = $false, ParameterSetName = 'Shutdown')]
        [switch]$Force,
        [Parameter(Mandatory = $True, ParameterSetName = 'Restart')]
        [switch]$Restart,
        [Parameter(Mandatory = $True, ParameterSetName = 'Shutdown')]
        [switch]$Shutdown,
        [Parameter(Mandatory = $True, ParameterSetName = 'Start')]
        [switch]$Start,
        [Parameter(Mandatory = $True, ParameterSetName = 'Status')]
        [switch]$Status
    )

    #Set the subscription - Set-AzContext
    Write-Host "Select the subscription containing the VM's" -ForegroundColor Green
    Set-Subscription

    #Set the Resourcegroup name being worked in
    Write-Host "Select the Resource Group containing the VM's" -ForegroundColor Green
    $RG = Get-AzResourceGroup | Out-GridView -PassThru -Title 'Select the resource group containing the VMs'
    Write-Host "Resource group set to $RG"

    #Invoke specified power state
    if ($Shutdown) {
        #Select VM's having their power state changed
        Write-Host "Select the VM's that are having their power state changed" -ForegroundColor Green
        $VMs = Get-AzVM -Status -ResourceGroupName $RG.ResourceGroupName | Out-GridView -PassThru -Title 'Select the VM or VMs that will have their power state changed'

        if ($Force) {
            #Forcefully shutdown the VMs
            $VMs | Stop-AzVM -ResourceGroupName $RG.ResourceGroupName -Force -NoWait
        }
        else {
            #Shutdown the VMs
            $VMs | Stop-AzVM -ResourceGroupName $RG.ResourceGroupName -NoWait
        }
    }

    if ($Start) {
        #Select VM's having their power state changed
        Write-Host "Select the VM's that are having their power state changed" -ForegroundColor Green
        $VMs = Get-AzVM -Status -ResourceGroupName $RG.ResourceGroupName | Out-GridView -PassThru -Title 'Select the VM or VMs that will have their power state changed'

        #Start the VMs
        $VMs | Start-AzVM -ResourceGroupName $RG.ResourceGroupName -NoWait
    }

    if ($Status) {
        Get-AzVM -Status -ResourceGroupName $RG.ResourceGroupName | Select-Object Name, Powerstate | Out-GridView
    }

    if ($restart) {
        #Select VM's having their power state changed
        Write-Host "Select the VM's that are having their power state changed" -ForegroundColor Green
        $VMs = Get-AzVM -Status -ResourceGroupName $RG.ResourceGroupName | Out-GridView -PassThru -Title 'Select the VM or VMs that will have their power state changed'

        #Restart the VMs
        $VMs | Restart-AzVM -ResourceGroupName $RG.ResourceGroupName -NoWait
    }
}