PowerShell: remove or replace quote marks from variable

后端 未结 6 1055
栀梦
栀梦 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:33

    Depending on a case, it might be simpler to use Trim(Char[]) method:
    ...Removes all leading and trailing occurrences...

    e.g. $your_variable.Trim('"')  
    

    It will remove quotes only from start and end of $your_variable. It will keep any quotes, escaped or not, which are inside the text of $your_variable as they were:

    PS C:\> $v.Trim('"') # where $v is: "hu""hu"hu'hu"
    hu""hu"hu'hu
    

    You can use Trim('"'), Trim("'"), but also both: Trim("`"'")

    Note that Trim() does not care if a quote is orphaned, meaning that it will remove ending or starting quote regardless of it having or not a paired quote on the other side of the string.

    PS C:\Users\Papo> $hu = "A: He asked `"whos this sofa?`" B: She replied: `"Chris'`""
    PS C:\Users\Papo> $hu
    A: He asked "whos this sofa?" B: She replied: "Chris'"
    PS C:\Users\Papo> $hu.trim('"')
    A: He asked "whos this sofa?" B: She replied: "Chris'
    PS C:\Users\Papo> # and even worse:
    PS C:\Users\Papo> $hu.trim("'`"")
    A: He asked "whos this sofa?" B: She replied: "Chris
    
    0 讨论(0)
  • 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'
    
    0 讨论(0)
  • 2021-02-19 02:38

    If the variable is a String object then you can do the following:

    $Variable.Replace("`"","")
    
    0 讨论(0)
  • 2021-02-19 02:52

    I actually just got it. The number of quotes and double quotes was confusing me, but this has worked and blat did not error.

    $var -replace '"', ""
    

    Those quotes are: single, double, single, comma, double, double.

    0 讨论(0)
  • 2021-02-19 02:52

    If you use Powershell's built-in send-mailmessage (2.0 required), you can eliminate your dependency on blat.exe and properly handle this issue without editing the description from the event log.

    0 讨论(0)
  • 2021-02-19 02:56

    None of the above answers worked for me. So I created the following solution...

    Search and Replace the character single Quote "'" ascii Character (39) with a space " " ascii Character (32)

    $strOldText = [char] 39
    $strNewText = [char] 32
    
    $Variable. = $Variable..Replace($strOldText, $strNewText).Trim()
    
    0 讨论(0)
提交回复
热议问题