PowerShell Get-Content ein PowerShell-Äquivalent für Tail

Mit Automatisierung ist das Lesen von Daten aus einer Textdatei ein häufiges Szenario. Die meisten Programmiersprachen haben mindestens eine Möglichkeit, Textdateien zu lesen, und PowerShell bildet da keine Ausnahme. Das PowerShell-Get-Content-Cmdlet, das einem PowerShell-Äquivalent für den Befehl „tail“ entspricht, liest den Inhalt einer Textdatei und importiert die Daten in eine PowerShell-Sitzung.

Das PowerShell-Get-Content-Cmdlet ist ein unverzichtbares Werkzeug, wenn Sie Textdateien als Eingabe für Ihr Skript verwenden müssen. Vielleicht muss Ihr PowerShell-Skript eine Computerliste zum Überwachen lesen oder eine E-Mail-Vorlage importieren, um an Ihre Benutzer zu senden. PowerShell Get-Content unterstützt diese Szenarien problemlos!

Wie wäre es, einer Protokolldatei in Echtzeit zu folgen? Ja, das PowerShell Get-Content kann das auch! Lesen Sie diesen Artikel weiter, und Sie erfahren, wie Sie das Get-Content-Cmdlet verwenden, um Textdateien in PowerShell zu lesen.

Voraussetzungen

Wenn Sie daran interessiert sind, die Beispiele in diesem Tutorial zu verfolgen, benötigen Sie die folgenden Voraussetzungen.

  • Sie benötigen einen Computer, der unter Windows 10 läuft. Dieses Tutorial verwendet Windows 10 Version 20H2. Aber keine Sorge, Sie werden auch mit der Windows 10-Version, die Sie haben, in Ordnung sein.
  • Sie sollten mindestens Windows PowerShell 5.1 oder PowerShell 7.1 auf Ihrem Computer installiert haben. Hier wird PowerShell 7.1 verwendet, aber jede Version wird funktionieren!
  • Sie werden Befehle schreiben und testen, daher benötigen Sie einen Code-Editor. Die empfohlenen Editoren sind Windows PowerShell ISE, der in Windows integriert ist, und Visual Studio Code (VSCode). Dieser Artikel verwendet VSCode.
  • Es wird auch helfen, wenn Sie ein Arbeitsverzeichnis auf Ihrem Computer erstellen. Der Arbeitsordner kann überall sein, wo Sie möchten. Sie werden jedoch feststellen, dass die Beispiele in diesem Tutorial im C:\demo-Ordner liegen.
  • Um loszulegen, benötigen Sie etwas Inhalt! Erstellen Sie eine Datei in Ihrem Arbeitsverzeichnis mit dem Namen fruits.txt, die aus zehn verschiedenen Früchten zur Vereinfachung besteht. Sie werden diese Textdatei in allen Beispielen verwenden.
cherry
 berry
 apricot
 papaya
 raspberry
 melon
 peach
 tangerine
 cantaloupe
 orange

Wissen Sie nicht, welche PowerShell-Version Sie haben? Besuchen Sie den Artikel So überprüfen Sie Ihre PowerShell-Version (Alle Möglichkeiten!).

Lesen einer Textdatei und Rückgabe des Ergebnisses als Zeichenfolgenarray

Das Get-Content-Cmdlet liest den Inhalt einer Datei und gibt standardmäßig jede Zeile einer Textdatei als Zeichenfolgenobjekt zurück. Als Ergebnis wird die Sammlung von PowerShell-Objekten zu einem Array von Zeichenfolgenobjekten.

Der folgende Code liest den Inhalt der Datei fruits.txt und zeigt das Ergebnis in der PowerShell-Konsole an, wie im folgenden Screenshot zu sehen.

Get-Content .\fruits.txt
Retrieving the text file content using PowerShell Get-Content.

Get-Content liest und speichert den Inhalt als Array, aber wie wissen Sie das sicher? Speichern Sie zunächst den Inhalt in einem PowerShell-Objekt, das Sie dann untersuchen können, um den Typ zu bestimmen.

Save the content into to a object
 $fruits = Get-Content .\fruits.txt
 Display the type of the object
 $fruits.GetType()
 Retrieve the count of items within the object
 $fruits.Count
 Output the contents of the object to the console
 $fruits

Schau dir den untenstehenden Screenshot an. Die Variable $fruits ist ein Array, das zehn Objekte enthält. Jedes Objekt repräsentiert eine einzelne Textzeile.

Confirming that the text file content is stored as an array.

Ausgabe einer bestimmten Zeile aus einer Textdatei

Im vorherigen Beispiel hast du gelernt, dass das Standardergebnis von Get-Content ein Array oder eine Sammlung von Objekten ist. Jeder Eintrag in einer Sammlung entspricht einer Indexnummer, und PowerShell-Indizes starten in der Regel bei null.

Der Screenshot unten zeigt, dass es zehn Elemente im Zeichenkettenarray gibt. Das Array indexiert die zehn Elemente von null bis neun.

Showing that the indexed items in the string array start at zero index.

Um nur die fünfte Inhaltszeile anzuzeigen, musst du die Indexnummer 4 angeben, eingeschlossen in eckigen Klammern (bekannt als Array-Notation).

(Get-Content .\fruits.txt)[4]

Vielleicht fällt dir auf, dass der Befehl Get-Content in Klammern eingeschlossen ist. Diese Notation sagt PowerShell, den Befehl in den Klammern zuerst auszuführen, bevor andere Operationen durchgeführt werden.

Im untenstehenden Screenshot siehst du, dass das einzige zurückgegebene Ergebnis raspberry ist, das Element am Index 4 und der fünften Zeile in der Textdatei entspricht.

Returning a specific line from Get-Content results.

Was ist, wenn du den Inhalt in der letzten Zeile benötigst? Glücklicherweise musst du die Gesamtanzahl der Zeilen nicht wissen. Verwende stattdessen [-1] als Index, und Get-Content zeigt nur die letzte Zeile der Datei an.

(Get-Content .\fruits.txt)[-1]

Begrenzung der Anzahl der zurückgegebenen Top-Ergebnisse durch Get-Content

Verwenden Sie das TotalCount-Parameter von Get-Content, um eine bestimmte Anzahl von Zeilen aus einer Textdatei abzurufen. Der TotalCount-Parameter akzeptiert einen long-Wert, was einen maximalen Wert von 9.223.372.036.854.775.807 bedeutet.

Zum Beispiel liest der folgende Befehl den Inhalt und beschränkt das Ergebnis auf drei Elemente.

Get-Content .\fruits.txt -TotalCount 3

Wie erwartet zeigt das Ergebnis unten nur die ersten drei Zeilen vom Anfang der Textdatei an.

Reading the top three results using the Get-Content command and the TotalCount parameter.

Verwenden Sie den PowerShell-Tail-Parameter, um Ergebnisse vom Ende einer Datei zurückzugeben.

In dem vorherigen Beispiel haben Sie das PowerShell Get-Content-Cmdlet verwendet, um eine Textdatei zu lesen und die Top-Ergebnisse zu beschränken. Es ist auch möglich, das Gegenteil mit PowerShell Get-Content zu erreichen. Verwenden Sie den PowerShell Tail-Parameter, um eine bestimmte Anzahl von Zeilen vom Ende einer Datei zu lesen.

Der folgende Beispielcode liest die Textdatei und zeigt den Inhalt der unteren vier Zeilen an.

Get-Content .\fruits.txt -Tail 4

Nach Ausführung des PowerShell tail-Befehls wird das erwartete Ergebnis auf die letzten vier Zeilen des Inhalts beschränkt, wie im Bild unten gezeigt.

Getting the results from the end of a file using the Get-Content Tail parameter.

Der Tail-Parameter wird oft zusammen mit dem Wait-Parameter verwendet. Die Verwendung des Wait-Parameters hält die Datei offen und überprüft einmal pro Sekunde auf neuen Inhalt. Die nachstehende Demonstration zeigt die Tail– und Wait-Parameter in Aktion. Um Wait zu beenden, verwenden Sie die Tastenkombination STRG+C.

Get-Content -Path .\fruits.txt -Tail 1 -Wait
Using the wait and Tail parameters with Get-Content.

Die Ergebnisse als einzelnen String zurückgeben

Es ist Ihnen vielleicht aufgefallen, dass Sie in früheren Beispielen mit Zeichenfolgenarrays als Ausgabe von PowerShell Get-Content gearbeitet haben. Und wie Sie bisher gelernt haben, ermöglicht Ihnen die Natur von Arrays, auf den Inhalt einzeln zuzugreifen.

Arrays funktionieren oft gut, können jedoch das Ersetzen von Zeichenfolgen erschweren. Der Raw-Parameter von Get-Content liest den gesamten Inhalt einer Datei in ein einzelnes Zeichenfolgenobjekt ein. Obwohl der folgende Code derselbe ist wie im ersten Beispiel verwendet, speichert der Raw-Parameter den Dateiinhalt als einzelne Zeichenfolge.

Save the content into to a object
 $fruits = Get-Content .\fruits.txt -Raw
 Display the type of the object
 $fruits.GetType()
 Retrieve the count of items within the object
 $fruits.Count
 Output the contents of the object to the console
 $fruits

Der Screenshot unten zeigt, dass das Hinzufügen des Raw-Parameters zu Get-Content dazu führt, dass der Inhalt als einzelne Zeichenfolge und nicht als Array von Objekten behandelt wird.

Confirming that the Raw parameter of Get-Content reads the file content as a single string object.

Sobald Sie den Inhalt einer Datei mit dem Raw-Parameter in einer einzelnen Zeichenfolge haben, was können Sie damit machen? Vielleicht müssen Sie eine Zeichenfolge in diesem Dateiinhalt finden und ersetzen. Im folgenden Beispiel liest Get-Content den Inhalt einer Datei als einzelne Zeichenfolge. Dann wird mit dem replace-Operator ein bestimmtes Wort durch ein anderes ersetzt.

Verwandt: Zeichenfolgen finden und ersetzen

# Holen Sie sich den Rohinhalt der Textdatei
$fruits = Get-Content .\fruits.txt -Raw
# Zeigen Sie den Inhalt an
$fruits
# Finden und ersetzen Sie das Wort 'apricot' durch 'mango'
$fruits -replace 'apricot','mango'
Reading the content of a text file as a single string and replacing a word using the replace operator.

Lesen Sie nur den Inhalt von Dateien, die einem Filter entsprechen

Haben Sie einen Ordner voller Dateien, aber müssen den Inhalt nur einiger weniger lesen? Mit PowerShell Get-Content müssen Sie die Dateien nicht separat filtern, bevor Sie den Inhalt lesen. Der Filter-Parameter von Get-Content beschränkt, welche Dateien das Cmdlet liest.

Um zu demonstrieren, wie man nur den Inhalt bestimmter Dateien liest, erstellen Sie zunächst ein paar Dateien, die Sie lesen möchten. Wie unten gezeigt, erstellen Sie die Dateien in Ihrem Arbeitsordner mit Add-Content.

# Add-Content erstellt die Dateien log1.log und log2.log, wenn sie noch nicht existieren, und fügt den angegebenen Wert hinzu
Add-Content -Value "This is the content in Log1.log" -Path C:\demo\Log1.log
Add-Content -Value "This is the content in Log2.log" -Path C:\demo\Log2.log
# Überprüfen Sie, ob die Dateien erstellt wurden
Get-ChildItem C:\demo
Creating test .log files using Add-Content.

Mit Ihren Testdateien verwenden Sie die Parameter Filter und Pfad, um nur .log-Dateien im Stammverzeichnis zu lesen. Das Sternchen in der Filterdefinition gibt Get-Content an, dass jede Datei mit .log am Ende gelesen werden soll. Das endende Sternchen des Pfadparameters beschränkt das Lesen von Dateien nur auf das Stammverzeichnis.

Get-Content -Path C:\demo* -Filter *.log

Wie im unten stehenden Ausgabebereich gezeigt, wird nur der Inhalt der .log-Dateien angezeigt.

Using the Filter parameter with PowerShell Get-Content to limit the read files.

Verwandt: Get-ChildItem: Dateien, Registry, Zertifikate und mehr als eine auflisten

Lesen des alternativen Datenstroms einer Datei

Bisher haben Sie ausschließlich mit Textdateien gearbeitet, aber Get-Content kann Daten aus dem alternativen Datenstrom (ADS) einer Datei lesen. Fühlen Sie sich frei, mehr über Streams zu lesen, aber Sie können sich einen Stream als ein weiteres Datenattribut vorstellen, das neben dem üblichen Dateiinhalt gespeichert wird.

Alternative Datenströme sind ein Merkmal des Windows NTFS-Dateisystems, daher gilt dies nicht für Get-Content, wenn es mit nicht-Windows-Betriebssystemen verwendet wird.

Sie können alternative Datenströme sehen, indem Sie Get-Item mit dem Stream-Parameter ausführen. Wenn Sie eine Datei mit dem Stream-Parameter referenzieren, gibt Get-Item eine Eigenschaft namens Stream zurück, wie unten dargestellt. Dieser Standarddateiinhalt wird mit :$DATA dargestellt.

Um den Standard-:$DATA-Stream zu demonstrieren, verwenden Sie das Get-Item-Cmdlet, um alle verfügbaren Streams in der Datei fruits.txt anzuzeigen. Wie unten gezeigt, zeigt Get-Item einen einzigen Stream an.

Get-Item -Path .\fruits.txt -Stream *
Listing all available streams in a file using Get-Item.

Der Stream-Parameter von Get-Content liest explizit den Inhalt des Standard-:$DATA-Streams, wie unten gezeigt. Der zurückgegebene Inhalt ist derselbe wie der Standardausgabewert von Get-Content, da der :$DATA-Stream standardmäßig gelesen wird.

Get-Content -Path .\fruits.txt -Stream ':$DATA'
Explicitly reading the :$DATA stream using Get-Content.

Um einen alternativen Datenstrom mithilfe von `Get-Content` abzurufen, modifizieren Sie eine Datei mit `Add-Content`, um den neuen Datenstrom hinzuzufügen. Verwenden Sie `Get-Item`, um den neuen Datenstrom neben dem Standarddatenstrom `:$DATA` anzuzeigen, wie im folgenden Beispiel.

# Fügen Sie eine neue ADS namens Secret zur Datei fruits.txt hinzu
Add-Content -Path .\fruits.txt -Stream Secret -Value 'This is a secret. No one should find this.'
Get-Item -Path .\fruits.txt -Stream *
Adding the Secret alternate data stream using Add-Content and displaying the new stream with Get-Item.

Da standardmäßig nur der `:$DATA`-Datenstrom gelesen wird, verwenden Sie den `Stream`-Parameter von `Get-Content`, um den Inhalt des neuen `Secret`-Datenstroms abzurufen. Wie unten gezeigt, wird der Inhalt des `Secret`-Datenstroms anstelle des Standarddateiinhalts angezeigt.

Get-Content -Path .\fruits.txt -Stream secret
Using Get-Content to read the Secret alternate data stream content.

Nächste Schritte mit PowerShell `Get-Content`

In diesem Artikel haben Sie viele Möglichkeiten kennengelernt, `Get-Content` zum Lesen und Manipulieren von Inhalten zu verwenden. Sie haben sogar gelernt, dass `Get-Content` flexibel genug ist, um Inhalte aus alternativen Datenströmen zu lesen!

Mit dem, was Sie in diesem Artikel gelernt haben, wie können Sie `Get-Content` sonst noch in Ihrer Arbeit verwenden? Vielleicht können Sie `Get-Content` verwenden, um festzustellen, ob eine Sicherungsdatei veraltet ist, und automatisch einen Aufruf zum Ausführen eines Sicherungsprozesses auslösen?

Source:
https://adamtheautomator.com/powershell-get-content/