PowerShell: удалить или заменить кавычки из переменной
Я использую Get-EventLog, чтобы установить переменную, а затем устанавливаю другую переменную с описанием идентификатора события. Затем я использую blat.exe, чтобы отправить эту информацию группе.
Описание содержит кавычки. Кавычки приводят к тому, что blat завершается с ошибкой.
Есть ли способ удалить кавычки из события. Сообщение и заменить их пробелом или чем-то?
6 ответов
Я на самом деле только что получил это. Количество кавычек и двойных кавычек меня смущало, но это сработало, и Блат не ошибся.
$var -replace '"', ""
Эти кавычки: одинарные, двойные, одинарные, запятая, двойная, двойная.
Если переменная является объектом String, вы можете сделать следующее:
$Variable.Replace("`"","")
Проще использовать метод Trim(Char[]):
... Удаляет все начальные и конечные вхождения...
e.g. $your_variable.Trim('"')
он будет сохранять любые кавычки, экранированные или нет, внутри строки:
PS C:\> $v.Trim('"') # where $v is: "hu""hu"hu'hu"
hu""hu"hu'hu
принять во внимание, это также удалит осиротевшие двойные кавычки:
PS C:\> $v.Trim('"') # where $v is: "hu""hu"hu'hu
hu""hu"hu'hu
Если вы используете встроенный в Powershell send-mailmessage
(Требуется 2.0), вы можете устранить свою зависимость от blat.exe
и правильно обработать эту проблему, не редактируя описание из журнала событий.
Проблема в том, что простая замена очищает каждый символ кавычки, даже если экранированный (удвоенный). Вот функции, которые я создал для моего использования:
- тот, который удаляет только лишние кавычки.
- тот, который избегает их
Я также сделал их общими для управления другими символами с помощью необязательного параметра $charToReplace
#Replaces single occurences 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'
Ни один из приведенных выше ответов не помог мне. Итак, я создал следующее решение...
Поиск и замена одинарного символа. Цитата "'" Символ ascii (39) с пробелом " " Символ ascii (32)
$strOldText = [char] 39
$strNewText = [char] 32
$Variable. = $Variable..Replace($strOldText, $strNewText).Trim()