如何忽略存储在PowerShell字符串变量中的转义序列?

时间:2009-02-09 11:21:25

标签: regex powershell escaping

在我的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周围使用括号而没有运气。

3 个答案:

答案 0 :(得分:32)

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

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

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

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

答案 1 :(得分:0)

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

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

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

e.g。 。 - > \。

答案 2 :(得分:0)

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

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

它应该按照需要工作。