Вопрос:
Я использую Get-EventLog для установки переменной, а затем устанавливаю другую переменную с описанием идентификатора события. Затем я использую blat.exe для отправки этой информации в группу.
Описание содержит кавычки. Кавычки заставляют blat выйти с ошибкой.
Есть ли способ удалить кавычки из события. Сообщение и заменить их пробелом или чем-то?
Лучший ответ:
Я просто получил его. Количество котировок и двойных кавычек меня сбивало с толку, но это сработало, и blat не ошибся.
$var -replace ‘»‘, «»
Эти кавычки: одиночные, двойные, одиночные, запятые, двойные, двойные.
Ответ №1
Если переменная является объектом String, вы можете сделать следующее:
$Variable.Replace(«`»»,»») Ответ №2
Если вы используете встроенный send-mailmessage (2.0) PowerShell, вы можете устранить свою зависимость от blat.exe и должным образом справиться с этой проблемой, не редактируя описание из журнала событий.
Ответ №3
Проблема заключается в том, что простая замена очищает каждый символ, даже если сэкономлена (удваивается).
Вот функции, которые я создал для моего использования:
- который удаляет только сиротские кавычки.
- который ускользает от них
Я также сделал их обобщенными для управления другими символами, с параметром optionnal $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’ Ответ №4Ни один из вышеперечисленных ответов не работал у меня. Поэтому я создал следующее решение…
Поиск и замена символа одиночного Цитата “‘” ascii Персонаж (39) с пробелом “” ascii Персонаж (32)
$strOldText = [char] 39 $strNewText = [char] 32 $Variable. = $Variable..Replace($strOldText, $strNewText).Trim() Ответ №5
проще, используйте метод 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