【问题标题】:How to ignore escape sequences stored in PowerShell string variable?如何忽略存储在 PowerShell 字符串变量中的转义序列?
【发布时间】:2010-10-06 09:07:25
【问题描述】:

在我的 PowerShell 脚本中,我在多个文件上运行 Select-String,寻找通过变量 ($id) 传递到其中的字符串:

foreach ($file in (ls "path\to\files")) {
    $found = $false
    $found = Select-String -Path $file $id -Quiet
    if ($found) {
        break
    }
}

不幸的是,$id 变量有时类似于“\C”或“\T”,Select-String 试图将其解释为转义序列。这些不是有效的转义序列,因此 Select-String 会引发错误。它们不打算成为转义序列(例如,它可能是文件路径的一部分,例如“C:\Test”),那么如何防止 PowerShell/Select-String 将它们解释为这样呢?我试过在 $id 周围使用括号,但没有成功。

【问题讨论】:

    标签: regex powershell escaping


    【解决方案1】:

    使用静态escape() 方法,它指示正则表达式引擎按字面意思解释这些字符而不是元字符:

    $id = [regex]::escape($id)
    

    您也可以将命令转为单行(-path 可以获取文件集合):

    Select-String -Path path\to\files\\* -Pattern ([regex]::escape($id)) -Quiet
    

    【讨论】:

    • 如果我可以投票两次,我会再给单线+1。 :-)
    • 遗憾的是,单行不适用于特定情况 - 我剪掉了 -Filter 和 -Recurse 参数
    • 在这种情况下:dir path\to\files -r | Select-String -Pattern ([regex]::escape($id)) -Quiet -list
    • [regex]::escape() 确实是在一般正则表达式的上下文中将字符串视为文字(逐字)的方法,但特别是 Select-String,更简单的解决方案是使用 @ 987654327@开关。
    【解决方案2】:

    Select-String 有一个-SimpleMatch 参数,它将导致 cmdlet 进行简单的字符串匹配而不是正则表达式。如果您将脚本更改为:

     $found = Select-String -Path $file $id -Quiet -SimpleMatch
    

    它应该可以按需要工作。

    【讨论】:

      【解决方案3】:

      如果 $id 字符串在传递给您时已经包含类似 TAB 的内容,那么我不知道有一个内置方法可以安全地将其转义回“\t”。您首先需要确保您的脚本传递了正确的字符串。 IE。它需要传递 0x5C74 (\t) 而不是 0x09 (TAB)。所以在第一次定义搜索字符串时需要进行转义。

      Regex.Escape 将转义 TAB -> \t 但也会转义任何在正则表达式中有意义的字符:

      \、*、+、?、|、{、[、(,)、^、$、.、# 和空格

      例如. -> \。

      【讨论】:

        猜你喜欢
        • 2011-07-11
        • 2021-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-02-24
        • 2016-03-17
        • 2015-11-10
        • 1970-01-01
        相关资源
        最近更新 更多