functions/Convert-String.ps1

function Convert-WUString {
    <#
        .SYNOPSIS
        Convert strings for a specific purpose.
 
        .DESCRIPTION
        Convert strings for a specific purpose.
 
        .EXAMPLE
        PS C:\>Convert-WUString -String ('{0}{1}' -f [char]0xFF11, [char]0xFF12) -Type FullWidthNumberToHalfWidthNumber
        12
 
        .EXAMPLE
        PS C:\>Convert-WUString -String ('{0}{1}' -f [char]0xFF21, [char]0xFF41) -Type FullWidthAlphabetToHalfWidthAlphabet
        Aa
 
        .EXAMPLE
        PS C:\>Convert-WUString -String 'apple_orange-CHERRY melon' -Type FullWidthNumberToHalfWidthNumber
        AppleOrangeCHERRYMelon
 
        .EXAMPLE
        PS C:\>Convert-WUString -String ('a`$a{0}{1}{2}"' -f [char]0x201C, [char]0x201D, [char]0x201E) -Type EscapeForPowerShellDoubleQuotation
    #>


    [CmdletBinding()]
    param (
        # Specifies the strings to convert.
        [Parameter(Mandatory,
            Position = 0,
            ValueFromPipeline,
            ValueFromPipelineByPropertyName)]
        [ValidateNotNullOrEmpty()]
        [string[]]
        $String,

        # If FullWidthNumberToHalfWidthNumber is specified, convert full width number to half width number.
        # If FullWidthAlphabetToHalfWidthAlphabet is specified, convert full width alphabet to half width alphabet.
        # If PascalCase is specified, converts the beginning of each string separated by spaces, underscores, or hyphens to uppercase, and removes spaces, underscores, and hyphens.
        # If EscapeForPowerShellDoubleQuotation is specified, escape Quotation mark (U+0022), Dollar sign (U+0024), Grave accent (U+0060), Left double quotation mark (U+201C), Right double quotation mark (U+201D), Double low-9 quotation mark (U+201E) for PowerShell doubleQuotation.
        [Parameter(Mandatory)]
        [ValidateSet('FullWidthNumberToHalfWidthNumber',
            'FullWidthAlphabetToHalfWidthAlphabet',
            'PascalCase',
            'EscapeForPowerShellDoubleQuotation')]
        [string]
        $Type
    )

    begin {
        Set-StrictMode -Version 'Latest'
    }

    process {
        foreach ($aString in $String) {
            switch ($Type) {
                'FullWidthNumberToHalfWidthNumber' {
                    $aString `
                        -creplace [char]0xFF10, "0" `
                        -creplace [char]0xFF11, "1" `
                        -creplace [char]0xFF12, "2" `
                        -creplace [char]0xFF13, "3" `
                        -creplace [char]0xFF14, "4" `
                        -creplace [char]0xFF15, "5" `
                        -creplace [char]0xFF16, "6" `
                        -creplace [char]0xFF17, "7" `
                        -creplace [char]0xFF18, "8" `
                        -creplace [char]0xFF19, "9"
                    break
                }
                'FullWidthAlphabetToHalfWidthAlphabet' {
                    $aString `
                        -creplace [char]0xFF21, "A" `
                        -creplace [char]0xFF22, "B" `
                        -creplace [char]0xFF23, "C" `
                        -creplace [char]0xFF24, "D" `
                        -creplace [char]0xFF25, "E" `
                        -creplace [char]0xFF26, "F" `
                        -creplace [char]0xFF27, "G" `
                        -creplace [char]0xFF28, "H" `
                        -creplace [char]0xFF29, "I" `
                        -creplace [char]0xFF2A, "J" `
                        -creplace [char]0xFF2B, "K" `
                        -creplace [char]0xFF2C, "L" `
                        -creplace [char]0xFF2D, "M" `
                        -creplace [char]0xFF2E, "N" `
                        -creplace [char]0xFF2F, "O" `
                        -creplace [char]0xFF30, "P" `
                        -creplace [char]0xFF31, "Q" `
                        -creplace [char]0xFF32, "R" `
                        -creplace [char]0xFF33, "S" `
                        -creplace [char]0xFF34, "T" `
                        -creplace [char]0xFF35, "U" `
                        -creplace [char]0xFF36, "V" `
                        -creplace [char]0xFF37, "W" `
                        -creplace [char]0xFF38, "X" `
                        -creplace [char]0xFF39, "Y" `
                        -creplace [char]0xFF3A, "Z" `
                        -creplace [char]0xFF41, "a" `
                        -creplace [char]0xFF42, "b" `
                        -creplace [char]0xFF43, "c" `
                        -creplace [char]0xFF44, "d" `
                        -creplace [char]0xFF45, "e" `
                        -creplace [char]0xFF46, "f" `
                        -creplace [char]0xFF47, "g" `
                        -creplace [char]0xFF48, "h" `
                        -creplace [char]0xFF49, "i" `
                        -creplace [char]0xFF4A, "j" `
                        -creplace [char]0xFF4B, "k" `
                        -creplace [char]0xFF4C, "l" `
                        -creplace [char]0xFF4D, "m" `
                        -creplace [char]0xFF4E, "n" `
                        -creplace [char]0xFF4F, "o" `
                        -creplace [char]0xFF50, "p" `
                        -creplace [char]0xFF51, "q" `
                        -creplace [char]0xFF52, "r" `
                        -creplace [char]0xFF53, "s" `
                        -creplace [char]0xFF54, "t" `
                        -creplace [char]0xFF55, "u" `
                        -creplace [char]0xFF56, "v" `
                        -creplace [char]0xFF57, "w" `
                        -creplace [char]0xFF58, "x" `
                        -creplace [char]0xFF59, "y" `
                        -creplace [char]0xFF5A, "z"
                    break
                }
                'PascalCase' {
                    $words = $aString -split ("`n|`r`n|\W|_|-")

                    $aNewString = ''
                    foreach ($word in $words) {
                        if ($word -eq '') {
                            continue
                        }

                        $newWord = '{0}{1}' -f $word.Substring(0, 1).ToUpper(), $word.Remove(0, 1)
                        $aNewString = '{0}{1}' -f $aNewString, $newWord
                    }
                    $aNewString
                    break
                }
                'EscapeForPowerShellDoubleQuotation' {
                    $aString `
                        -creplace '"', '""' `
                        -creplace '`', '``' `
                        -creplace '\$', '`$' `
                        -creplace [char]0x201C, ('`{0}' -f [char]0x201C) `
                        -creplace [char]0x201D, ('`{0}' -f [char]0x201D) `
                        -creplace [char]0x201E, ('`{0}' -f [char]0x201E)
                    break
                }
            }
        }
    }
}