Build and Parse Query Strings with System.Uri in PowerShell

PowerShell
function ConvertTo-QueryString {
    param([Parameter(Mandatory)][hashtable]$Parameters)
    $pairs = foreach ($entry in ($Parameters.GetEnumerator() | Sort-Object Key)) {
        $k = [uri]::EscapeDataString([string]$entry.Key)
        $v = [uri]::EscapeDataString([string]$entry.Value)
        "$k=$v"
    }
    $pairs -join '&'
}
function ConvertFrom-QueryString {
    param([Parameter(Mandatory)][AllowEmptyString()][string]$Query)
    $result = @{}
    foreach ($pair in ($Query.TrimStart('?') -split '&')) {
        if (-not $pair) { continue }
        $key, $value = $pair -split '=', 2
        if ($null -eq $value) { $value = '' }
        $name = [uri]::UnescapeDataString($key)
        $result[$name] = [uri]::UnescapeDataString($value)
    }
    $result
}