Note: these examples use the variables created in the Quick Start: Encoding section above.

# url1: http%3A%2F%2Ftest.com%3Ftest%3Dmy%20value
[uri]::UnescapeDataString($url1)
# Returns: <http://test.com?test=my> value

# url2: <http://test.com?test=my%20value>
[uri]::UnescapeDataString($url2)
# Returns: <http://test.com?test=my> value

# url3: http%3a%2f%2ftest.com%3ftest%3dmy+value
[uri]::UnescapeDataString($url3)
# Returns: <http://test.com?test=my+value>

# Note: There is no `[uri]::UnescapeUriString()`; 
#       which makes sense since the `[uri]::UnescapeDataString()` 
#       function handles everything it would handle plus more.

# HttpUtility requires at least .NET 1.1 to be installed.
# url1: http%3A%2F%2Ftest.com%3Ftest%3Dmy%20value
[System.Web.HttpUtility]::UrlDecode($url1)
# Returns: <http://test.com?test=my> value

# HttpUtility requires at least .NET 1.1 to be installed.
# url2: <http://test.com?test=my%20value>
[System.Web.HttpUtility]::UrlDecode($url2)
# Returns: <http://test.com?test=my> value

# HttpUtility requires at least .NET 1.1 to be installed.
# url3: http%3a%2f%2ftest.com%3ftest%3dmy+value
[System.Web.HttpUtility]::UrlDecode($url3)
# Returns: <http://test.com?test=my> value

Note: More info on HTTPUtility.