Public/Get-CloudPCByProvisioningPolicy.ps1

function Get-CloudPCByProvisioningPolicy {
    <#
    .SYNOPSIS
        Groups Cloud PCs under their provisioning policies and returns one row per policy.

    .DESCRIPTION
        Fetches Cloud PCs with Get-CloudPC and groups them by ProvisioningPolicyId, returning
        one PSCustomObject per policy (PSTypeName = 'WindowsCloudPC.ProvisioningPolicyCloudPCs')
        with a CloudPCCount and a CloudPCs array of the matching Get-CloudPC objects.

        Useful for answering "how many Cloud PCs are on each policy" and "which Cloud PCs
        belong to which policy" without leaving stale/null fields on the policy object itself.

        Empty policies (policies with zero Cloud PCs provisioned) are included with
        CloudPCCount = 0 and CloudPCs = @() so you can spot drift.

    .PARAMETER ProvisioningPolicyId
        Optional: scope the result to a single policy. Accepts pipeline input by property
        name from Get-CloudPCProvisioningPolicy.

    .EXAMPLE
        Get-CloudPCByProvisioningPolicy | Format-Table DisplayName,ProvisioningType,CloudPCCount

    .EXAMPLE
        Get-CloudPCByProvisioningPolicy |
            Select-Object DisplayName -ExpandProperty CloudPCs |
            Format-Table DisplayName,Name,ProvisioningStatus

    .EXAMPLE
        Get-CloudPCProvisioningPolicy -Id 8e8a545f-6168-4472-9466-9f05520a5eb3 |
            Get-CloudPCByProvisioningPolicy
    #>

    [CmdletBinding()]
    [OutputType('WindowsCloudPC.ProvisioningPolicyCloudPCs')]
    param(
        [Parameter(Position = 0, ValueFromPipelineByPropertyName)]
        [Alias('Id')]
        [string]$ProvisioningPolicyId
    )

    begin {
        Connect-CloudPC | Out-Null
        $piped = $false
        $ids   = [System.Collections.Generic.List[string]]@()
    }

    process {
        if ($ProvisioningPolicyId) {
            $piped = $true
            $ids.Add($ProvisioningPolicyId)
        }
    }

    end {
        $policies = if ($piped) {
            foreach ($id in $ids) { Get-CloudPCProvisioningPolicy -Id $id }
        }
        else {
            Get-CloudPCProvisioningPolicy
        }

        # Fetch CloudPCs once per policy (Graph supports a per-policy filter so this is
        # cheaper than pulling the full estate when only one policy was requested).
        foreach ($p in $policies) {
            $cpcs = @( Get-CloudPC -ProvisioningPolicyId $p.Id )

            [pscustomobject]@{
                PSTypeName              = 'WindowsCloudPC.ProvisioningPolicyCloudPCs'
                Id                      = $p.Id
                ProvisioningPolicyId    = $p.Id
                DisplayName             = $p.DisplayName
                ProvisioningType        = $p.ProvisioningType
                ImageDisplayName        = $p.ImageDisplayName
                AssignedGroupNames      = $p.AssignedGroupNames
                CloudPCCount            = $cpcs.Count
                CloudPCs                = $cpcs
            }
        }
    }
}