22

在我的 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 周围使用括号,但没有成功。

4

3 回答 3

32

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

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

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

Select-String -Path path\to\files\\* -Pattern ([regex]::escape($id)) -Quiet
于 2009-02-09T12:11:36.227 回答
1

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

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

它应该按需要工作。

于 2018-03-23T19:07:39.997 回答
0

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

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

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

例如。-> \。

于 2009-02-09T12:32:51.513 回答