PowerShell: remove or replace quote marks from variable

后端 未结 6 1056
栀梦
栀梦 2021-02-19 02:24

I\'m using Get-EventLog to set a variable, and then setting another variable with the event ID description. I then use blat.exe to email this information to a group.

Th

6条回答
  •  时光说笑
    2021-02-19 02:36

    The problem is that a simple replace cleans out every quote character, even if escaped (doubled). Here are the functions I created for my use :

    • one which removes only orphan quotes.
    • one which escapes them

    I also made them generic to manage other characters, with the optional $charToReplace parameter

    #Replaces single occurrences of characters in a string.
    #Default is to replace single quotes
    Function RemoveNonEscapedChar {
        param(
            [Parameter(Mandatory = $true)][String] $param,
            [Parameter(Mandatory = $false)][String] $charToReplace
        )
    
        if ($charToReplace -eq '') {
            $charToReplace = "'"
        }
        $cleanedString = ""
        $index = 0
        $length = $param.length
        for ($index = 0; $index -lt $length; $index++) {
            $char = $param[$index]
            if ($char -eq $charToReplace) {
                if ($index +1 -lt $length -and $param[$index + 1] -eq $charToReplace) {
                    $cleanedString += "$charToReplace$charToReplace"
                    ++$index ## /!\ Manual increment of our loop counter to skip next char /!\
                }
                continue
            }
            $cleanedString += $char
        }
        return $cleanedString
    }
    #A few test cases : 
    RemoveNonEscapedChar("'st''r'''i''ng'")                               #Echoes st''r''i''ng
    RemoveNonEscapedChar("""st""""r""""""i""""ng""") -charToReplace '"'   #Echoes st""r""i""ng
    RemoveNonEscapedChar("'st''r'''i''ng'") -charToReplace 'r'            #Echoes 'st'''''i''ng'
    

    #Escapes single occurences of characters in a string.  Double occurences are not escaped.  e.g.  ''' will become '''', NOT ''''''.
    #Default is to replace single quotes
    Function EscapeChar {
        param(
            [Parameter(Mandatory = $true)][String] $param,
            [Parameter(Mandatory = $false)][String] $charToEscape
        )
        
        if ($charToEscape -eq '') {
            $charToEscape = "'"
        }
        $cleanedString = ""
        $index = 0
        $length = $param.length
        for ($index = 0; $index -lt $length; $index++) {
            $char = $param[$index]
            if ($char -eq $charToEscape) {
                if ($index +1 -lt $length -and $param[$index + 1] -eq $charToEscape) {
                    ++$index ## /!\ Manual increment of our loop counter to skip next char /!\
                }
                $cleanedString += "$charToEscape$charToEscape"
                continue
            }
            $cleanedString += $char
        }
        return $cleanedString
    }
    #A few test cases : 
    EscapeChar("'st''r'''i''ng'")                              #Echoes ''st''r''''i''ng''
    EscapeChar("""st""""r""""""i""""ng""") -charToEscape '"'   #Echoes ""st""r""""i""ng""
    EscapeChar("'st''r'''i''ng'") -charToEscape 'r'            #Echoes 'st''rr'''i''ng'
    

提交回复
热议问题