Get-ChildItem – Unterverzeichnisse mit der PowerShell durchsuchen

PowerShell (von starwindsoftware.com)

In dem heutigen Beitrag möchte ich an meinen vorherigen Eintrag, der Suche innerhalb von Textdateien mittels dem PowerShell cmdlet Select-String, anknüpfen. Mittels dem PowerShell cmdlet Get-ChildItem könnt ihr die Dateien eines Unterverzeichnisses nach eurer Zeichenfolge oder Begriff durchsuchen. Beispiel:

Select-String -path *.* -exclude *.zip *.rar *.pdf -pattern „DO.*=“ -NotMatch

In diesem Beispiel würden in dem aktuellen Verzeichnis alle Dateien, bis auf die ZIP-, RAR- und PDF-Dateien, durchsucht. Im Gegensatz zu find und findstr ist Select-String alleine nicht in der Lage, rekursiv die Dateien in dem Verzeichnis zu durchsuchen. Wenn ihr das jedoch möchtet, muss man zu weiteren PowerShell Mitteln greifen. Im einfachsten Falle könnt ihr die Ausgabe von Get-ChildItem über eine Pipe an Select-String weiterreichen. Beispiel:

Get-ChildItem *.* -exclude *.zip *.rar *.pdf | Select-String -pattern „DO.*=“

Da die Auswahl der Dateitypen vollständig von Get-ChildItem übernommen wird, kann sich der Aufruf von Select-String in diesem Fall auf die Übergabe des reinen Suchmusters beschränken.

Suchergebnisse aus MatchInfo-Objekten

Im Unterschied zu den textbasierten Kommandozeilen-Tools gibt ein PowerShell cmdlet Objekte zurück. Konkret handelt es sich da um den Typ MatchInfo. Diese Objekte bieten eigene Eigenschaften, die eine weitergehende Auswertung der Ergebnisse erlauben. Leitet ihr also die Ausgabe von Select-String an Get-Member weiter, dann erhaltet ihr eine Liste aller Methoden und Eigenschaften.

Wie könnt ihr diese Eigenschaften verwenden?

Die Objekt Eigenschaften sind dann interessant, um die Ausgabe des cmdlets zu verändern, sofern ihr mit der reinen Ausgabe von Pfad – Dateiname – Zeilennummer – Zeileninhalt nicht zufrieden seid. Als Beispiel

Select-String -path beispieldatei.html -SimpleMatch „begriff“ | select FileName, LineNumber

würde euch nur den Dateinamen und die Zeilennummer anzeigen, in der euer Suchbegriff gefunden wurde. Die weitere Eigenschaft Matches ist dann besonders praktisch, wenn komplexere reguläre Ausdrücke verwendet werden. In diesem Fall kann man oft nicht ganz sicher sein, auf welche Zeichenketten diese tatsächlich zutreffen. Dann würde

Select-String -path *.* -pattern „DO.*=“ | select Matches

genau diese Übereinstimmungen anzeigen. Durch Standardeinstellungen seht ihr in diesem Fall allerdings nur die ersten Treffer pro Zeile. Um wirklich alle zu erhalten, muss man den Schalter -AllMatches hinzufügen.

Manipulationen an den Fundstellen

Da sich die Ergebnisse von Select-String an alle möglichen cmdlets weiterreichen lassen, ergeben sich dadurch fast unbegrenzte Möglichkeiten der Weiterverarbeitung. Beginnend bei der Formatierung der Ausgabe durch die Weitergabe an Format-List. Dadurch würdet ihr eine wesentlich übersichtlichere Ausgabe erhalten. Ebenso stehen alle Funktoinen für die String-Manipulationen zur Verfügung, um z.B. die gefundenen Textstellen zu verändern. Beispiel:

Select-String -path *.cmd -pattern „DO.*=“ | ForEach ($_.ToString().ToLower()}

Dadurch wird die Ausgabe in Kleinbuchstaben konvertiert. Genauso gut könntet ihr aber auch einen Substring rausfiltern oder mit anderen Zeichenketten zusammenfügen.

Ein Kommentar

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.