PowerShell:从变量中删除或替换引号

时间:2013-02-11 16:37:38

标签: powershell blat

我正在使用Get-EventLog设置变量,然后使用事件ID描述设置另一个变量。然后我使用blat.exe将此信息通过电子邮件发送给组。

说明中包含引号。引号导致blat退出并出错。

有没有办法从event.Message中删除引号并用空格或其他东西替换它们?

6 个答案:

答案 0 :(得分:16)

如果变量是String对象,那么您可以执行以下操作:

$Variable.Replace("`"","")

答案 1 :(得分:11)

我其实刚刚得到它。引号和双引号的数量令我感到困惑,但这已经奏效,而且不会出错。

$var -replace '"', ""

这些引号是:单引号,双引号,单引号,逗号,双引号,双引号。

答案 2 :(得分:3)

如果您使用Powershell的内置send-mailmessage(需要2.0),则可以消除对blat.exe的依赖性并正确处理此问题,而无需编辑事件日志中的说明。

答案 3 :(得分:2)

问题在于,即使转义(加倍),简单替换也会清除每个引号字符。 以下是我为我使用创建的函数:

  • 仅删除孤儿引号的内容。
  • 逃脱他们的人

我还使用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 :(得分:1)

simpler, use Trim(Char[]) method中提取href:
...删除所有前导和尾随事件......

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

答案 5 :(得分:0)

上述答案都不适合我。所以我创建了以下解决方案......

搜索并替换字符单引号“'”ascii字符(39),带空格“”ascii字符(32)

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

$Variable. = $Variable..Replace($strOldText, $strNewText).Trim()