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 に答える
0

$ id文字列が渡されたときにすでにTABのようなものが含まれている場合、それを「\t」に安全にエスケープするための組み込みメソッドを認識していません。そもそも、スクリプトに正しい文字列が渡されていることを確認する必要があります。つまり、0x09(TAB)ではなく0x5C74(\ t)を渡す必要があります。したがって、検索文字列を最初に定義するときにエスケープを実行する必要があります。

Regex.EscapeはTAB->\tをエスケープしますが、正規表現内で意味を持つこれらの文字もエスケープします。

\、*、+、?、|、{、[、(、)、^、$、。、#、および空白

例:。->\。

于 2009-02-09T12:32:51.513 に答える