Private/Invoke-W365CloudPCAction.ps1

function Invoke-W365CloudPCAction {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [object]$CloudPC,

        [string]$Action
    )

    begin {
        Import-W365CliWindowsCloudPC
    }

    process {
        $actionToRun = if ($Action) { $Action } else { 'Back' }

        switch ($actionToRun) {
            'Remote action history' {
                    Show-W365CloudPCRemoteActionHistory -CloudPC $CloudPC
            }
            'Disk space utilization' {
                    Show-W365DiskSpace -CloudPC $CloudPC -Browse | Out-Null
            }
            'Resize' {
                    Invoke-W365Resize -CloudPC $CloudPC
            }
            'Power on' {
                    Invoke-W365CloudPCConfirmedAction -CloudPC $CloudPC -ActionName 'Power on' -PreviewScript {
                        param($TargetCloudPC, $Context)

                        $TargetCloudPC | Start-CloudPC -PassThru -WhatIf
                    } -SubmitScript {
                        param($TargetCloudPC, $Context)

                        $TargetCloudPC | Start-CloudPC -PassThru -Force
                    } -OfferRemoteActionHistory
            }
            'Rename' {
                    $newDisplayName = Read-Host 'New Cloud PC display name'
                    if ([string]::IsNullOrWhiteSpace($newDisplayName)) {
                        Write-Warning 'Rename cancelled. New display name is required.'
                        Write-Host 'Press any key to continue...' -ForegroundColor DarkGray
                        [Console]::ReadKey($true) | Out-Null
                        return
                    }

                    $managedDeviceChoice = Read-W365CliChoice -Prompt 'Also rename the Intune managed device?' -Choices @(
                        'No',
                        'Yes, use the same name',
                        'Yes, enter a different managed device name'
                    ) -AllowBack
                    if ($managedDeviceChoice -lt 0) {
                        return
                    }

                    $renameParams = @{
                        CloudPC        = $CloudPC
                        NewDisplayName = $newDisplayName
                        PassThru       = $true
                    }

                    if ($managedDeviceChoice -eq 1) {
                        $renameParams.ManagedDeviceName = $newDisplayName
                    }
                    elseif ($managedDeviceChoice -eq 2) {
                        $managedDeviceName = Read-Host 'New managed device name'
                        if ([string]::IsNullOrWhiteSpace($managedDeviceName)) {
                            Write-Warning 'Rename cancelled. Managed device name is required for this option.'
                            Write-Host 'Press any key to continue...' -ForegroundColor DarkGray
                            [Console]::ReadKey($true) | Out-Null
                            return
                        }

                        $renameParams.ManagedDeviceName = $managedDeviceName
                    }

                    Invoke-W365CloudPCConfirmedAction -CloudPC $CloudPC -ActionName 'Rename' -Context @{
                        Params = $renameParams
                    } -PreviewScript {
                        param($TargetCloudPC, $Context)

                        $params = $Context.Params
                        Rename-CloudPC @params -WhatIf
                    } -SubmitScript {
                        param($TargetCloudPC, $Context)

                        $params = $Context.Params
                        Rename-CloudPC @params -Force
                    } -OfferRemoteActionHistory
            }
            'Sync' {
                    Invoke-W365CloudPCConfirmedAction -CloudPC $CloudPC -ActionName 'Sync' -PreviewScript {
                        param($TargetCloudPC, $Context)

                        $TargetCloudPC | Sync-CloudPC -PassThru -WhatIf
                    } -SubmitScript {
                        param($TargetCloudPC, $Context)

                        $TargetCloudPC | Sync-CloudPC -PassThru -Force
                    } -OfferRemoteActionHistory
            }
            'Reset local admin password' {
                    Invoke-W365CloudPCConfirmedAction -CloudPC $CloudPC -ActionName 'Reset local admin password' -PreviewScript {
                        param($TargetCloudPC, $Context)

                        $TargetCloudPC | Reset-CloudPCLocalAdminPassword -PassThru -WhatIf
                    } -SubmitScript {
                        param($TargetCloudPC, $Context)

                        $TargetCloudPC | Reset-CloudPCLocalAdminPassword -PassThru -Force
                    } -OfferRemoteActionHistory
            }
            'Restart' {
                    Invoke-W365CloudPCConfirmedAction -CloudPC $CloudPC -ActionName 'Restart' -PreviewScript {
                        param($TargetCloudPC, $Context)

                        $TargetCloudPC | Restart-CloudPC -PassThru -WhatIf
                    } -SubmitScript {
                        param($TargetCloudPC, $Context)

                        $TargetCloudPC | Restart-CloudPC -PassThru -Force
                    } -OfferRemoteActionHistory
            }
            'Snapshots' {
                    Show-W365Snapshot -CloudPC $CloudPC -Browse | Out-Null
            }
            'Reprovision' {
                    $osChoice = Read-W365CliChoice -Prompt 'Reprovision OS version' -Choices @(
                        'Keep policy/default',
                        'Windows 11',
                        'Windows 10'
                    ) -AllowBack
                    if ($osChoice -lt 0) {
                        return
                    }

                    $accountChoice = Read-W365CliChoice -Prompt 'Reprovision user account type' -Choices @(
                        'Keep policy/default',
                        'Standard user',
                        'Administrator'
                    ) -AllowBack
                    if ($accountChoice -lt 0) {
                        return
                    }

                    $reprovisionParams = @{
                        CloudPC  = $CloudPC
                        PassThru = $true
                    }
                    if ($osChoice -eq 1) {
                        $reprovisionParams.OsVersion = 'windows11'
                    }
                    elseif ($osChoice -eq 2) {
                        $reprovisionParams.OsVersion = 'windows10'
                    }

                    if ($accountChoice -eq 1) {
                        $reprovisionParams.UserAccountType = 'standardUser'
                    }
                    elseif ($accountChoice -eq 2) {
                        $reprovisionParams.UserAccountType = 'administrator'
                    }

                    Invoke-W365CloudPCConfirmedAction -CloudPC $CloudPC -ActionName 'Reprovision' -Context @{
                        Params = $reprovisionParams
                    } -PreviewScript {
                        param($TargetCloudPC, $Context)

                        $params = $Context.Params
                        Invoke-CloudPCReprovision @params -WhatIf
                    } -SubmitScript {
                        param($TargetCloudPC, $Context)

                        $params = $Context.Params
                        Invoke-CloudPCReprovision @params -Force
                    } -OfferRemoteActionHistory
            }
            'End grace period' {
                    Invoke-W365CloudPCConfirmedAction -CloudPC $CloudPC -ActionName 'End grace period' -PreviewScript {
                        param($TargetCloudPC, $Context)

                        $TargetCloudPC | Invoke-CloudPCEndGracePeriod -PassThru -WhatIf
                    } -SubmitScript {
                        param($TargetCloudPC, $Context)

                        $TargetCloudPC | Invoke-CloudPCEndGracePeriod -PassThru -Force
                    } -OfferRemoteActionHistory
            }
            default {
                return
            }
        }
    }

    end { }
}