private/core/ConvertFrom-QueryString.ps1

function ConvertFrom-QueryString {
    <#
    .SYNOPSIS
        Convert Query String to object.

    .DESCRIPTION
        Converts Query String to object.

    .PARAMETER InputStrings
        Value to convert

    .PARAMETER DecodeParameterNames
        URL decode parameter names

    .PARAMETER AsHashtable
        Converts to hash table object

    .EXAMPLE
        PS C:\>ConvertFrom-QueryString '?name=path/file.json&index=10'

        Convert query string to object.

    .EXAMPLE
        PS C:\>'name=path/file.json&index=10' | ConvertFrom-QueryString -AsHashtable

        Convert query string to hashtable.

    .INPUTS
        System.String

    .LINK
        https://github.com/jasoth/Utility.PS
    #>

    [CmdletBinding(DefaultParameterSetName = 'Default')]
    [OutputType([psobject], ParameterSetName = 'Default')]
    [OutputType([hashtable], ParameterSetName = 'AsHashtable')]
    param (
        [Parameter(Mandatory = $true, Position = 0, ValueFromPipeline = $true)]
        [string[]]
        $InputStrings,

        [switch]
        $DecodeParameterNames,

        [Parameter(ParameterSetName = 'AsHashtable')]
        [switch]
        $AsHashtable
    )

    process {
        foreach ($inputString in $InputStrings) {
            $outputObject = @{ }
            if ($inputString[0] -eq '?') {
                $inputString = $inputString.Substring(1)
            }
            $queryParameters = $inputString.Split('&')

            foreach ($queryParameter in $queryParameters) {
                $key, $value = $queryParameter.Split('=')
                if ($DecodeParameterNames) {
                    $key = [System.Net.WebUtility]::UrlDecode($key)
                }
                $outputObject[$key] = [System.Net.WebUtility]::UrlDecode($value)
            }

            if ($AsHashtable) {
                $outputObject
            }
            else {
                [PSCustomObject]$outputObject
            }
        }
    }
}