Private/Invoke-W365ProvisioningPolicyAction.ps1

function Invoke-W365ProvisioningPolicyAction {
    [CmdletBinding()]
    param(
        [Parameter(Mandatory)]
        [object]$Policy,

        [string]$Action
    )

    begin {
        Import-W365CliWindowsCloudPC
    }

    process {
        switch ($Action) {
            'View Cloud PCs' {
                $cloudPcs = @(Get-CloudPC -ProvisioningPolicyId $Policy.Id | Sort-Object Name)
                if ($cloudPcs.Count -eq 0) {
                    Write-Warning 'No Cloud PCs were returned for this provisioning policy.'
                    Write-Host 'Press any key to continue...' -ForegroundColor DarkGray
                    [Console]::ReadKey($true) | Out-Null
                    return
                }

                Select-W365CliObject -InputObject $cloudPcs -Title "Cloud PCs in $($Policy.DisplayName)" -DisplayProperties @(
                    'Name',
                    'AssignedUserUpn',
                    'ProvisioningType',
                    'ProvisioningStatus',
                    'ServicePlanName'
                ) -FilterProperties @(
                    'Name',
                    'ManagedDeviceName',
                    'AssignedUserUpn',
                    'ProvisioningType',
                    'ProvisioningStatus',
                    'ServicePlanName'
                ) -LabelScript {
                    param($CloudPC)

                    '{0} {1} {2} {3} {4}' -f
                        (Format-W365CliText -Text $CloudPC.Name -Width 34),
                        (Format-W365CliText -Text $CloudPC.AssignedUserUpn -Width 34),
                        (Format-W365CliText -Text $CloudPC.ProvisioningType -Width 10),
                        (Format-W365CliText -Text $CloudPC.ProvisioningStatus -Width 14),
                        (Format-W365CliText -Text $CloudPC.ServicePlanName -Width 40)
                } -DetailScript {
                    param($CloudPC)

                    @(
                        "Name: $($CloudPC.Name)"
                        "Managed device name: $($CloudPC.ManagedDeviceName)"
                        "Assigned user: $($CloudPC.AssignedUserUpn)"
                        "Provisioning type: $($CloudPC.ProvisioningType)"
                        "Provisioning status: $($CloudPC.ProvisioningStatus)"
                        "Service plan: $($CloudPC.ServicePlanName)"
                        "Cloud PC ID: $($CloudPC.Id)"
                        "Managed device ID: $($CloudPC.ManagedDeviceId)"
                        "Entra device ID: $($CloudPC.AadDeviceId)"
                    )
                } -ActionScript {
                    param($CloudPC, $Action)

                    Invoke-W365CloudPCAction -CloudPC $CloudPC -Action $Action
                } -ActionLabelsScript {
                    param($CloudPC)

                    Get-W365CloudPCActionItem -CloudPC $CloudPC
                } -SummaryScript {
                    param(
                        [object[]]$AllItems,
                        [object[]]$VisibleItems,
                        [string]$Filter,
                        [int]$SelectedIndex
                    )

                    Get-W365CloudPCSummary -AllItems $AllItems -VisibleItems $VisibleItems -Filter $Filter -SelectedIndex $SelectedIndex
                } -ColumnHeader ('{0} {1} {2} {3} {4}' -f
                    (Format-W365CliText -Text 'Name' -Width 34),
                    (Format-W365CliText -Text 'Assigned user' -Width 34),
                    (Format-W365CliText -Text 'Type' -Width 10),
                    (Format-W365CliText -Text 'Status' -Width 14),
                    (Format-W365CliText -Text 'Service plan' -Width 40)
                ) -RefreshScript {
                    @(Get-CloudPC -ProvisioningPolicyId $Policy.Id | Sort-Object Name)
                } -PageSize 18 -ViewOnly -Breadcrumb @('W365CLI','Provisioning','Provisioning policies','Cloud PCs') | Out-Null
            }
            'Export' {
                $defaultPath = Join-Path -Path (Get-Location) -ChildPath ("{0}.json" -f ($Policy.DisplayName -replace '[\\/:*?"<>|]', '-'))
                $path = Read-Host "Export path [$defaultPath]"
                if ([string]::IsNullOrWhiteSpace($path)) {
                    $path = $defaultPath
                }

                $Policy | Export-CloudPCProvisioningPolicy -Path $path -Force
                Write-Host ''
                Write-Host "Exported to $path" -ForegroundColor Green
                Write-Host 'Press any key to continue...' -ForegroundColor DarkGray
                [Console]::ReadKey($true) | Out-Null
            }
            'Create copy' {
                $displayName = Read-Host 'New policy display name'
                if ([string]::IsNullOrWhiteSpace($displayName)) {
                    Write-Warning 'Create copy cancelled. Display name is required.'
                    Write-Host 'Press any key to continue...' -ForegroundColor DarkGray
                    [Console]::ReadKey($true) | Out-Null
                    return
                }

                $assignChoice = Read-W365CliChoice -Prompt 'Recreate assignment targets on the new policy?' -Choices @(
                    'No',
                    'Yes'
                ) -AllowBack
                if ($assignChoice -lt 0) {
                    return
                }

                $export = $Policy | Export-CloudPCProvisioningPolicy
                $createParams = @{
                    InputObject = $export
                    DisplayName = $displayName
                }
                if ($assignChoice -eq 1) {
                    $createParams.Assign = $true
                }

                Invoke-W365CloudPCConfirmedAction -CloudPC ([pscustomobject]@{
                    Name            = $Policy.DisplayName
                    AssignedUserUpn = ''
                }) -ActionName 'Create' -TargetType 'provisioning policy copy' -Context @{
                    Params = $createParams
                } -PreviewScript {
                    param($Target, $Context)

                    $params = $Context.Params
                    New-CloudPCProvisioningPolicy @params -WhatIf
                } -SubmitScript {
                    param($Target, $Context)

                    $params = $Context.Params
                    New-CloudPCProvisioningPolicy @params -Force
                }
            }
            'Delete' {
                Invoke-W365CloudPCConfirmedAction -CloudPC ([pscustomobject]@{
                    Name            = $Policy.DisplayName
                    AssignedUserUpn = ''
                }) -ActionName 'Delete' -TargetType 'provisioning policy' -Context @{
                    Policy = $Policy
                } -PreviewScript {
                    param($Target, $Context)

                    $Context.Policy | Remove-CloudPCProvisioningPolicy -PassThru -WhatIf
                } -SubmitScript {
                    param($Target, $Context)

                    $Context.Policy | Remove-CloudPCProvisioningPolicy -PassThru -Force
                }
            }
            'Reprovision policy Cloud PCs' {
                $osChoice = Read-W365CliChoice -Prompt 'Policy reprovision OS version' -Choices @('Keep policy/default','Windows 11','Windows 10') -AllowBack
                if ($osChoice -lt 0) { return }
                $accountChoice = Read-W365CliChoice -Prompt 'Policy reprovision user account type' -Choices @('Keep policy/default','Standard user','Administrator') -AllowBack
                if ($accountChoice -lt 0) { return }
                $excludeInput = Read-Host 'Exclude Cloud PCs by name, ID, or UPN (comma-separated, optional)'
                $params = @{ ProvisioningPolicyId = $Policy.Id }
                if ($osChoice -eq 1) { $params.OsVersion = 'windows11' }
                elseif ($osChoice -eq 2) { $params.OsVersion = 'windows10' }
                if ($accountChoice -eq 1) { $params.UserAccountType = 'standardUser' }
                elseif ($accountChoice -eq 2) { $params.UserAccountType = 'administrator' }
                if (-not [string]::IsNullOrWhiteSpace($excludeInput)) {
                    $params.ExcludeCloudPC = @($excludeInput -split ',' | ForEach-Object { $_.Trim() } | Where-Object { $_ })
                }
                Invoke-W365CloudPCConfirmedAction -CloudPC ([pscustomobject]@{ Name = $Policy.DisplayName }) -ActionName 'Reprovision' -TargetType 'policy Cloud PCs' -Context @{ Params = $params } -PreviewScript {
                    param($Target, $Context)
                    $invokeParams = $Context.Params
                    Invoke-CloudPCPolicyReprovision @invokeParams -WhatIf
                } -SubmitScript {
                    param($Target, $Context)
                    $invokeParams = $Context.Params
                    Invoke-CloudPCPolicyReprovision @invokeParams -Force
                }
            }
            default {
                return
            }
        }
    }

    end { }
}