Public/Resolve-URI.ps1

function Resolve-URI {
  <#
    .SYNOPSIS
    Resolve URI

    .DESCRIPTION
    Parse a unform resource identifier (URI) and resolve restricted and reserved characters

    .PARAMETER URI
    The URI parameter corresponds to the uniform resource identifier to resolve.

    .INPUTS
    System.String. You can pipe the uniform resource identifier to Resolve-URI.

    .OUTPUTS
    System.String. Resolve-URI returns the encoded uniform resource identifier.

    File name: Resolve-URI.ps1
    Author: Florian Carrier
    Creation date: 2018-12-12
    Last modified: 2020-01-16

    .LINK
    https://en.wikipedia.org/wiki/Uniform_Resource_Identifier

    .LINK
    https://en.wikipedia.org/wiki/Percent-encoding
  #>

  [CmdletBinding ()]
  Param (
    [Parameter (
      Position    = 1,
      Mandatory   = $true,
      HelpMessage = "URI to resolve",
      ValueFromPipeline               = $true,
      ValueFromPipelineByPropertyName = $true
    )]
    [String]
    $URI,
    [Parameter (
      HelpMessage = "Switch to limit parsing to restricted characters"
    )]
    [Switch]
    $RestrictedOnly
  )
  Begin {
    # Get global preference variables
    Get-CallerPreference -Cmdlet $PSCmdlet -SessionState $ExecutionContext.SessionState
    # List of restricted characters
    $RestrictedCharacters = [Ordered]@{
      "\" = '/'
      "%" = '%25'
    }
    # List of reserved characters
    $ReservedCharacters = [Ordered]@{
      " " = '%20'
      "," = '%2C'
      ";" = '%3B'
      ":" = '%3A'
      "!" = '%21'
      "?" = '%3F'
      "'" = '%27'
      "(" = '%28'
      ")" = '%29'
      "[" = '%5B'
      "]" = '%5D'
      "@" = '%40'
      "*" = '%2A'
      "/" = '%2F'
      "&" = '%26'
      "#" = '%23'
      "+" = '%2B'
      "=" = '%3D'
      "$" = '%24'
    }
  }
  Process {
    # Encode restricted characters
    foreach ($RestrictedCharacter in $RestrictedCharacters.GetEnumerator()) {
      $URI = $URI.Replace($RestrictedCharacter.Key, $RestrictedCharacter.Value)
    }
    # Encode reserved characters
    if (-Not $RestrictedOnly) {
      foreach ($ReservedCharacter in $ReservedCharacters.GetEnumerator()) {
        $URI = $URI.Replace($ReservedCharacter.Key, $ReservedCharacter.Value)
      }
    }
    # Return encoded URI
    return $URI
  }
}