22 Stimmen

Wie werden in PowerShell-Zeichenfolgenvariablen gespeicherte Escape-Sequenzen ignoriert?

In meinem PowerShell-Skript führe ich Select-String über eine Reihe von Dateien aus und suche nach einer Zeichenfolge, die über eine Variable ($id) übergeben wird:

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

Leider enthält die Variable $id manchmal Dinge wie " \C " oder " \T ", die Select-String als Escape-Sequenzen zu interpretieren versucht. Dies sind keine gültigen Escape-Sequenzen, so dass Select-String einen Fehler ausgibt. Sie sind nicht als Escape-Sequenzen gedacht (z. B. könnte es sich um einen Teil eines Dateipfads wie " C:\Test "), wie kann ich also verhindern, dass PowerShell/Select-String sie als solche interpretiert? Ich habe versucht, Klammern um $id herum zu verwenden, ohne Erfolg.

32voto

Shay Levy Punkte 113401

Verwenden Sie die statische escape() weist sie die Engine für reguläre Ausdrücke an, diese Zeichen wörtlich und nicht als Metazeichen zu interpretieren:

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

Sie können den Befehl auch in einen Einzeiler umwandeln ( -path kann eine Sammlung von Dateien aufnehmen):

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

0 Stimmen

Ich würde noch ein +1 für den Einzeiler geben, wenn ich zweimal hochstimmen könnte :-)

0 Stimmen

Leider funktioniert der Einzeiler für die spezielle Situation nicht - ich habe einen -Filter und einen -Recurse-Parameter weggelassen

0 Stimmen

In diesem Fall: dir path \to\files -r | Select-String -Pattern ([regex]::escape($id)) -Quiet -list

1voto

Bruce Payette Punkte 2311

Select-String hat eine -SimpleMatch Parameter, der das Cmdlet veranlasst, einfache Zeichenfolgenübereinstimmungen anstelle von regulären Ausdrücken durchzuführen. Wenn Sie das Skript so ändern, dass es Folgendes tut:

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

sollte es wie gewünscht funktionieren.

0voto

codybartfast Punkte 6793

Wenn die $id-Zeichenkette bereits etwas wie TAB enthält, wenn sie an Sie übergeben wird, dann ist mir keine eingebaute Methode bekannt, um sie sicher in "" umzuwandeln. \t ". Sie müssen sicherstellen, dass Ihr Skript überhaupt die richtige Zeichenfolge übergeben bekommt. D.h. es muss 0x5C74 übergeben werden ( \t ) und nicht 0x09 (TAB). Das Escaping muss also bei der ersten Definition des Suchstrings durchgeführt werden.

Regex.Escape bricht TAB aus -> \t aber auch alle anderen Zeichen, die in regulären Ausdrücken von Bedeutung sind:

\, *, +, ?, |, {, [, (,), ^, $,., #, und Leerzeichen

z.B. . -> \.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X