Sie können zum Suchen in Textdateien die beiden Windows eigenen Tools find bzw. findstr nutzen. Allerdings sind diese beiden Tools doch sehr eingeschränkt in ihren Möglichkeiten. Für die rudimentäre Suche zwar ausreichend, mehr aber auch nicht. Das Powershell cmdlet select-string bringt für diesen Zweck wesentliche Vorteile mit sich. Der wesentlichste ist natürlich die Möglichkeit der Weiterverarbeitung und die Übergabe an andere cmdlets über eine Pipe. Um in allen Dateien eines Verzeichnisses nach der Zeichenfolge “Marco.langlitz” zu suchen, reicht folgender Aufruf:
select-string -path *.* -pattern “marco.langlitz”
Zurückgeliefert werden der Dateiname, die Zeilennummer und der Zeileninhalt. Die Ausgabe erfolgt an stdout. Die Suche ist im Gegensatz zu find und findstr nicht case sensitive. Wenn man das möchte, muss man als Parameter -CaseSensitive mit angeben.
Der Parameter –pattern wird als regulärer Ausdruck – Regex (regular expressions) – interpretiert.
Eine einfache Suche nach einem String kann man statt dessen mit dem Parameter –SimpleMatch ausführen.
select-string -path *.* -SimpleMatch “marco.langlitz”
Die Suche lässt sich auch mit dem Parameter –NotMatch invers durchführen. Zurückgeliefert werden alle Zeilen von Dateien, die den angegebenen String nicht enthalten.
select-string -path *.* -NotMatch “marco.langlitz”
Sie können für die Suche auch Dateien ausschließen.
select-string -path *.* -exclude *.txt -SimpleMatch “marco.langlitz”
Die rekursive Suche in Unterverzeichnissen ist mit select-string leider nicht möglich. Dazu können die Funktionen von get-ChildItem aber verwendet werden:
get-ChildItem *.* -exclude *.txt -recurse |select-string -SimpleMatch “marco.langlitz”
Die Ausgabe können Sie natürlich noch mit allen Powershell Möglichkeiten anpassen. Wenn Sie zum Beispiel nur den Dateinamen und die Zeilennummer erhalten möchten, erreichen Sie diese über select.
get-ChildItem *.* -exclude *.txt -recurse |select-string -SimpleMatch “marco.langlitz” |select FileName, LineNumber
Die zurückgegebenen Objekte von Select-string lassen sich natürlich an verschiedenste cmdlets pipen, wodurch sich unzählige Möglichkeiten der Weiterverarbeitung ergeben. Zum Beispiel möchten Sie nach mehrere Strings suchen.
get-ChildItem *.* -exclude *.txt -recurse |select-string -SimpleMatch “marco.langlitz” |% {select-string -path $_.path “IT Consulting”} |select filename,LineNumber
Wenn Sie nach Strings mit Sonderzeichen suchen, müssen Sie noch beachten, dass Select-String nach Regex (regular expressions) sucht. Damit müssen Sie diverse Sonderzeichen entsprechend behandeln. Das Hochkomma müssen Sie z.B. verdoppeln, oder vor eine Klammer ein \ stellen.
Beispiel
falsch:
Select-String “Das ist insgesamt “50 €” wert”
richtig:
Select-String “Das ist insgesamt “”50 €”” wert”
falsch:
Select-String “Das ist insgesamt (50 €) wert”
richtig:
Select-String “Das ist insgesamt \(50 €\) wert”
Viel Spass damit! 😉