Get-Content: Dateien einlesen mit Powershell

    Den Inhalt einer Text­datei einzulesen und zu filtern gehört zu den Standard­aufgaben in der System­verwaltung, sei es inner­halb von Scripts oder auf der Kommando­zeile. Auch hier hat Powershell mit dem Cmdlet Get-Content mehr zu bieten als Uralt-Kommandos wie type.

    Wie die folgenden Beispiele zeigen, setzt Get-Content das objekt-orientierte Konzept der Powershell sogar mit unstrukturierten Informationen wie dem Inhalt einer Textdatei um. Beim Einlesen erzeugt es ein Array von String-Objekten, wobei jedes davon eine Zeile des Inhalts repräsentiert.

    Aufgrund dieser internen Darstellung lassen sich die für Strings vorhandenen Methoden und Eigenschaften nutzen, um die eingelesene Datei weiter­zuver­arbeiten.

    Quelldateien auswählen

    Die einfachste Anwendung von Get-Content besteht darin, dass man ihr als Parameter den Namen einer oder mehrerer Dateien (bzw. ein Muster unter Verwendung von Wildcards) übergibt, so dass es anschließend den eingelesenen Inhalt auf stdout ausgibt:

    Get-Content -path tt.cmd

    Diese simple Form lässt sich durch die Parameter -include sowie -exclude so spezifizieren, dass bei Verwendung von Wildcards bestimmte Dateien ein- oder ausgeschlossen werden.

    head- und tail-Kommandos simulieren

    Eine Verwendung von Get-Content kann darin bestehen, die von Unix bekannten Befehle head und tail zu simulieren, die bekanntlich eine bestimmte Zahl an Zeilen vom Anfang oder vom Ende der Datei anzeigen. Die ersten n Zeilen lassen sich mit Hilfe des Parameters -TotalCount ausgeben.

    Da Get-Content aber ein Array aus Strings erzeugt, kann man sich diese Tatsache zunutze machen, um flexibel auf eine beliebige Zahl von Zeilen an jeder Position zuzugreifen:

    (Get-Content -path Desktop\* -include *.php)[0 .. 9]

    gibt im Stil von head die ersten 10 Zeilen aus,

    (Get-Content -path Desktop\* -include *.php)[-1 .. -10]

    dagegen wie tail die letzten 10.

    Update: Seit PowerShell 3.0 unterstützt Get-Content die Parameter head und tail, so dass man nicht mehr mit dem Array-Index hantieren muss:

    Get-Content -path Desktop\* -include *.php -head 2

    würde die ersten zwei Zeilen aller PHP-Dateien im Verzeichnis Desktop ausgeben.

    Zeilen zählen

    Möchte man wissen, wie viele Zeilen eine Datei enthält, dann kann man dies über die length-Eigenschaft des Arrays ermitteln:

    (Get-Content -path tt.cmd).length

    Möchte man die Zeilen mit Nummern ausgeben, dann kann man diese über die Eigenschaft ReadCount abrufen:

    Get-Content -path tt.cmd | foreach{ $_.insert(0, $_.ReadCount)}

    Dateien sortieren

    Eine häufige Operation besteht im Sortieren der Zeilen, die aus seiner Textdatei ausgelesen wurden. Dies lässt sich einfach mittels Sort-Object (Alias sort) erledigen, im folgenden Beispiel absteigend, wobei der sortierte Inhalt wieder in die Ursprungsdatei zurückgeschrieben wird:

    Get-Content -path tt.cmd | sort -Descending | set-content -path tt.cmd

    Der weiteren Manipulation von eingelesenen Dateiinhalten sind beinahe keine Grenzen gesetzt, da man auf sie etwa alle Methoden von String-Objekten anwenden kann, beispielsweise replace, um Zeichenketten zu ersetzen.

    Keine Kommentare