Private/CP/New-CPQueryString.ps1

function New-CPQueryString {
    [CmdletBinding()]
    param(
        [Hashtable]$Parameters
    )

    if (-not $Parameters -or $Parameters.Count -eq 0) {
        return ''
    }

    $parts = foreach ($key in ($Parameters.Keys | Sort-Object)) {
        $value = $Parameters[$key]
        if ($null -eq $value) {
            continue
        }

        if ($value -is [string] -and [string]::IsNullOrWhiteSpace($value)) {
            continue
        }

        if ($value -is [System.Collections.IEnumerable] -and $value -isnot [string]) {
            $items = @($value | Where-Object { $null -ne $_ -and -not [string]::IsNullOrWhiteSpace([string]$_) })
            if ($items.Count -eq 0) {
                continue
            }

            $value = $items -join ','
        }
        elseif ($value -is [bool]) {
            $value = if ($value) { 'true' } else { 'false' }
        }

        $encodedKey = [System.Uri]::EscapeDataString([string]$key)
        $encodedValue = [System.Uri]::EscapeDataString([string]$value)
        "${encodedKey}=${encodedValue}"
    }

    return ($parts -join '&')
}