Public/Invoke-CPCEndGracePeriod.ps1

function Invoke-CPCEndGracePeriod {
    <#
        .SYNOPSIS
        Function to end the grace period of a CloudPC
        .DESCRIPTION
        Function to end the grace period of a CloudPC
        .PARAMETER name
        Name of the CloudPC to end the grace period of
        .PARAMETER All
        End the grace period of every CloudPC that is in its grace period
        .PARAMETER Force
        End the grace period without asking for confirmation
        .EXAMPLE
        Invoke-CPCEndGracePeriod -Name "CloudPC01"
        .EXAMPLE
        Invoke-CPCEndGracePeriod -All -Force
    #>


    [CmdletBinding(DefaultParameterSetName = 'Name')]
    param (
        [parameter(Mandatory, ParameterSetName = 'Name')]
        [ValidateNotNullOrEmpty()]
        [string]$Name,

        [Parameter(ParameterSetName = 'All')]
        [switch]$All,

        [Parameter()][switch]$Force
    )
        
    Begin {
        Get-TokenValidity
    
    }
        
    Process {
        switch ($PsCmdlet.ParameterSetName) {
            Name {  
                $CloudPCs = Get-CloudPC -name $Name | Where-Object { $_.status -eq "inGracePeriod" }
                Write-Verbose "Getting Single CloudPC inGracePeriod: $($CloudPCs.managedDeviceName)"

                If ($null -eq $CloudPCs) {
                    Throw "No CloudPC found in grace period with name $Name"
                    return
                }
                
            }

            All {
                $CloudPCs = Get-CloudPC | Where-Object { $_.status -eq "inGracePeriod" }
                Write-Verbose "Getting every CloudPC inGracePeriod: $($CloudPCs.managedDeviceName)"

                If ($null -eq $CloudPCs) {
                    Throw "No CloudPC found in grace period with name"
                    return
                }

            }
        }

        $Count = $CloudPCs.count

        if ($Force){
            $CloudPCs | ForEach-Object {
                try {
                    $url = "https://graph.microsoft.com/$script:MSGraphVersion/deviceManagement/virtualEndpoint/cloudPCs/$($_.id)/endGracePeriod"
                    
                    Write-Verbose "End Grace Period $($_.managedDeviceName) url: $($url)"

                    Invoke-RestMethod -Headers $script:Authheader -Uri $url -Method POST 

                    Write-Output "End Grace Period $($_.managedDeviceName)"
                }                                       
                catch {
                    Throw (Get-GraphErrorMessage $_)
                }
            }
        }
        else {

            Write-Output "$($Count) CloudPC(s) found in grace period"
            $choice = Read-Host "Are you sure you want to end the grace period for CloudPC(s)? (y/n)"
            if ($choice -ne "y") {
                Write-Output "Exiting script"
                return
            }
            
            $CloudPCs | ForEach-Object {
                try {
                    $url = "https://graph.microsoft.com/$script:MSGraphVersion/deviceManagement/virtualEndpoint/cloudPCs/$($_.id)/endGracePeriod"
    
                    Write-Verbose "End Grace Period $($_.displayName) url: $($url)"
    
                    Invoke-RestMethod -Headers $script:Authheader -Uri $url -Method POST

                    Write-Output "End Grace Period $($_.managedDeviceName)"
                }
                catch {
                    Throw (Get-GraphErrorMessage $_)
                }
            }
        }

    }
}