Public/Show-W365DiskSpace.ps1

function Show-W365DiskSpace {
    [CmdletBinding()]
    [OutputType('WindowsCloudPC.CloudPCDiskSpace')]
    param(
        [object]$CloudPC,

        [switch]$Browse
    )

    begin {
        Import-W365CliWindowsCloudPC
    }

    process {
        $loadMessage = if ($PSBoundParameters.ContainsKey('CloudPC')) {
            "Loading disk space for $($CloudPC.Name)."
        }
        else {
            'Loading Cloud PC disk space. This can take a while because Intune disk inventory is queried per Cloud PC.'
        }

        $items = @(Invoke-W365CliSpinner -Message $loadMessage -ArgumentList @($CloudPC) -ScriptBlock {
            param($TargetCloudPC)

            if ($TargetCloudPC) {
                $TargetCloudPC | Get-CloudPCDiskSpace
            }
            else {
                Get-CloudPCDiskSpace | Sort-Object PercentFree, CloudPcName
            }
        })
        if ($items.Count -eq 0) {
            Write-Warning 'No Cloud PC disk space records were returned.'
            return
        }

        $title = if ($PSBoundParameters.ContainsKey('CloudPC')) {
            "Disk space for $($CloudPC.Name)"
        }
        elseif ($Browse) {
            'Windows 365 Cloud PC disk space'
        }
        else {
            'Pick a Cloud PC disk space record'
        }
        $columnHeader = '{0} {1} {2} {3} {4} {5} {6}' -f
            (Format-W365CliText -Text 'Cloud PC' -Width 34),
            (Format-W365CliText -Text 'User' -Width 34),
            (Format-W365CliText -Text 'Free' -Width 9),
            (Format-W365CliText -Text 'Used' -Width 9),
            (Format-W365CliText -Text 'Total' -Width 9),
            (Format-W365CliText -Text 'Free %' -Width 8),
            (Format-W365CliText -Text 'Last sync' -Width 22)

        Select-W365CliObject -InputObject $items -Title $title -DisplayProperties @(
            'CloudPcName',
            'AssignedUserUpn',
            'FreeStorageGB',
            'UsedStorageGB',
            'TotalStorageGB',
            'PercentFree',
            'LastSyncDateTime'
        ) -FilterProperties @(
            'CloudPcName',
            'ManagedDeviceName',
            'AssignedUserUpn',
            'ProvisioningType',
            'ProvisioningPolicyName'
        ) -LabelScript {
            param($Disk)

            '{0} {1} {2} {3} {4} {5} {6}' -f
                (Format-W365CliText -Text $Disk.CloudPcName -Width 34),
                (Format-W365CliText -Text $Disk.AssignedUserUpn -Width 34),
                (Format-W365CliText -Text "$($Disk.FreeStorageGB) GB" -Width 9),
                (Format-W365CliText -Text "$($Disk.UsedStorageGB) GB" -Width 9),
                (Format-W365CliText -Text "$($Disk.TotalStorageGB) GB" -Width 9),
                (Format-W365CliText -Text "$($Disk.PercentFree)%" -Width 8),
                (Format-W365CliText -Text $Disk.LastSyncDateTime -Width 22)
        } -DetailScript {
            param($Disk)

            @(
                "Cloud PC: $($Disk.CloudPcName)"
                "Managed device: $($Disk.ManagedDeviceName)"
                "Assigned user: $($Disk.AssignedUserUpn)"
                "Provisioning type: $($Disk.ProvisioningType)"
                "Provisioning policy: $($Disk.ProvisioningPolicyName)"
                "Total storage: $($Disk.TotalStorageGB) GB"
                "Free storage: $($Disk.FreeStorageGB) GB"
                "Used storage: $($Disk.UsedStorageGB) GB"
                "Percent free: $($Disk.PercentFree)%"
                "Percent used: $($Disk.PercentUsed)%"
                "Last sync: $($Disk.LastSyncDateTime)"
                "Cloud PC ID: $($Disk.CloudPcId)"
                "Managed device ID: $($Disk.ManagedDeviceId)"
            )
        } -SummaryScript {
            param(
                [object[]]$AllItems,
                [object[]]$VisibleItems,
                [string]$Filter,
                [int]$SelectedIndex
            )

            $lowCount = @($AllItems | Where-Object { $null -ne $_.PercentFree -and $_.PercentFree -lt 15 }).Count
            $criticalCount = @($AllItems | Where-Object { $null -ne $_.PercentFree -and $_.PercentFree -lt 5 }).Count
            $averageFree = if ($AllItems.Count -gt 0) {
                [math]::Round((($AllItems | Where-Object { $null -ne $_.PercentFree } | Measure-Object -Property PercentFree -Average).Average), 1)
            }
            else {
                $null
            }

            @(
                "Total: $($AllItems.Count) | Visible: $($VisibleItems.Count) | Selected: $([math]::Min($SelectedIndex + 1, [math]::Max($VisibleItems.Count, 1)))"
                "Low free <15%: $lowCount | Critical <5%: $criticalCount | Average free: $averageFree%"
                $(if ($Filter) { "Search: $Filter" } else { 'Search: none' })
            )
        } -RefreshScript {
            @(Invoke-W365CliSpinner -Message "Refreshing $title." -ArgumentList @($CloudPC) -ScriptBlock {
                param($TargetCloudPC)

                if ($TargetCloudPC) {
                    $TargetCloudPC | Get-CloudPCDiskSpace
                }
                else {
                    Get-CloudPCDiskSpace | Sort-Object PercentFree, CloudPcName
                }
            })
        } -ColumnHeader $columnHeader -PageSize 18 -ViewOnly:$Browse -Breadcrumb @('W365CLI','Cloud PCs','Disk space')
    }

    end { }
}