PowerShell: удалить или заменить кавычки из переменной

Я использую Get-EventLog для установки переменной, а затем устанавливаю другую переменную с описанием идентификатора события. Затем я использую blat.exe, чтобы отправить эту информацию группе по электронной почте.

Описание содержит кавычки. Кавычки заставляют блат выходить с ошибкой.

Есть ли способ удалить кавычки из event.Message и заменить их пробелом или чем-то еще?


person Pat    schedule 11.02.2013    source источник


Ответы (6)


Если переменная является строковым объектом, вы можете сделать следующее:

$Variable.Replace("`"","")
person Musaab Al-Okaidi    schedule 11.02.2013

Я на самом деле только что получил это. Меня смущало количество кавычек и двойных кавычек, но это сработало, и блат не ошибся.

$var -replace '"', ""

Эти кавычки: одинарные, двойные, одинарные, запятая, двойные, двойные.

person Pat    schedule 11.02.2013

В зависимости от случая может быть проще использовать Метод Trim(Char[]):
...Удаляет все начальные и конечные вхождения...

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

Он удалит кавычки только с начала и конца переменной $your_variable. Он сохранит любые кавычки, экранированные или нет, которые находятся внутри текста $your_variable, как они были:

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

Вы можете использовать Trim('"'), Trim("'"), а также оба: Trim("`"'")

Обратите внимание, что Trim() не заботится о том, является ли кавычка потерянной, что означает, что он удалит конечную или начальную кавычку независимо от того, есть или нет парная кавычка на другой стороне строки.

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
person papo    schedule 29.07.2017

Если вы используете встроенный в Powershell send-mailmessage (требуется 2.0), вы можете устранить свою зависимость от blat.exe и правильно решить эту проблему, не редактируя описание в журнале событий.

person alroc    schedule 11.02.2013

Проблема в том, что простая замена удаляет каждый символ кавычек, даже если он экранирован (удвоен). Вот функции, которые я создал для себя:

  • тот, который удаляет только сиротские кавычки.
  • тот, который ускользает от них

Я также сделал их универсальными для управления другими символами с необязательным параметром $charToReplace.

#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'
person Balmipour    schedule 27.11.2015

Ни один из приведенных выше ответов не помог мне. Поэтому я создал следующее решение...

Найдите и замените одинарную кавычку "'" символ ascii (39) пробелом " " символ ascii (32)

$strOldText = [char] 39
$strNewText = [char] 32

$Variable. = $Variable..Replace($strOldText, $strNewText).Trim()
person Stuart Smith    schedule 19.04.2017
comment
На этот вопрос уже был дан ответ 4 года назад. Тем не менее, ваш новый ответ не дает контекста. Не могли бы вы отредактировать и объяснить, о чем вы говорите? - person Pat; 20.04.2017
comment
Было бы бесполезно пытаться дать лучший/альтернативный ответ, если бы этот вопрос не искали и не открывали в течение последних 4 лет. Trim() на самом деле является методом, предназначенным для обрезки символов с начала/конца строки. В данном случае это все еще не идеально, так как есть и более подходящая перегруженная версия Trim(Char[]). Проще и не будет удалять экранированные кавычки внутри строки и возможные пробелы. Проверьте мой ответ. - person papo; 29.07.2017