Bearbeiten von Text Dateien mit der PowerShell

Andreas Preuss
06-07-2018 14:09

Die Powershell, wohl das wichtigste Verwaltungswerkzeug für Windows-Admins, hat seinen Kommandozeileninterpreter schon von Beginn an stark an die Unix-Shells angelehnt. Mittlerweile läuft die Powershell zusätzlich zu den Linux-Distributionen Ubuntu, CentOS und Red Hat Enterprise Linux auch auf Mac OS X.

# Text Datei erstellen
PS C:\>'Name','Nummer' | out-file c:\temp\text.txt

# CSV Datei erstellen
PS C:\>'Name,Nummer' | out-file c:\temp\text.csv

# CSV Datei Inhalt anhängen
PS C:\>'Erhard,007' | out-file c:\temp\text.csv -Append

# Textdatei einlesen
PS C:\>Get-Content c:\temp\text.txt

CSV Datei aus einem Objekt erzeugen
Mittels Export-CSV können Objekte in eine CSV-Datei exportiert werden:

PS C:\>get-counter | Export-CSV test.csv -append

"append" fügt Werte zu einer bestehenden .csv-Datei hinzu und legt eine .csv Datei an, falls keine existiert. Eventuell nützliche zusätzliche Parameter:
-Encoding UTF8 ... kodiert die Datei in UTF8, wird eventuell benötigt, bei Problemen mit Umlauten
-Delimiter ";" ... Anstelle von "," als Trennzeichen wird ";" verwendet
-NoTypeInformation -Force ... deaktiviert die erste Zeile im CSV in der PowerShell
An dieser Stelle sind oft nur die Informationen zu den Datenfeldern ablegt.

# CSV Datei einlesen
PS C:\>Import-csv c:\temp\text.csv

# Ausgabe der CSV Spalte "Nummer"
PS C:\>Import-csv c:\temp\text.csv | select -ExpandProperty Nummer

# Bestimmten Eintrag aus der CSV-Datei auslesen
PS C:\>Import-csv c:\temp\text.csv | Where-Object {$_.Name -eq 'Erhard'}

#Bestimmten Wert aus der CSV-Datei auslesen
PS C:\>$(Import-csv c:\temp\text.csv | Where-Object {$_.Name -eq 'Erhard'}).Nummer

Wie oben schon ersitlich können mittels Pipe Symbol "|" mehrere Befehle verschachtelt oder umgeleitet werden. Wir lesen als Beispiel einmal das Eventlog auf einem Remote Computer aus. Mit Hilfe einer Pipe (|) kann darin gesucht werden und mit einem weiteren Pipe | kann das Ergebniss in eine csv Datei exportiert werden:

PS C:\>get-winevent -computername RemoteSystem -Logname System | where {$_.Message | findstr "zu suchen"} | Export-Csv c:\temp\sucheimEventlog.csv

Vergleichsoperatoren der Powershell
Um bestimmte Werte zu vergleichen gibt es die folgenden Vergleichsoperatoren
-eq gleich
-ne ungleich
-gt größer als
-ge größer oder gleich
-lt kleiner als
-le kleiner oder gleich

Dieser Befehl zeigt nach Grösse sortiert alle Dateien (dir) im Ordner C:\Users\Andreas\Desktop\IMG, die größer als 50KB sind

PS C:\>Get-ChildItem C:\Users\Andreas\Desktop\IMG | where-Object {$_.Length -gt 50KB} | Sort-Object Length

Damit die Sortierung den Datentyp richtig erkennt, kann auch etwas nachgeholfen werden:
Wenn alle Dateinamen aus Nummern bestehen, würde Sort-Object die Namen alphabetisch sortieren: 1000 wäre als Beispiel dann kleiner als 50. Abhilfe schafft das Zuweisen des Datentyps:

Sort-Object { $_.Name.replace("stringpart","") -as [int] }

Stringmanipulation
Um eine CSV Datei beispielsweise gleich mit der Powershell zu bearbeiten, kann man hier auch eine Stringmanipulation durchführen.

# .ToUpper() - Wandelt einen String in Großbuchstaben um
PS C:\>$("test").ToUpper()

#.ToLower() - Wandelt einen String in Kleinbuchstaben um
PS C:\>$("TEST").ToLower()

#.Contains() - Testet einen String, ob eine bestimmte Zeichenfolge vorhanden ist
PS C:\>$("TEST").Contains("ES")
# Ausgabe "True"

#.StartsWith() - Testet einen String, ob dieser mit einer bestimmten Zeichenfolge beginnt.
PS C:\>$("TEST").StartsWith("TE")
# Ausgabe "True"

#.EndsWith() - Testet einen String, ob dieser mit einer bestimmten Zeichenfolge endet.
PS C:\>$("TEST").EndsWith("ST")
# Ausgabe "True"

#.Replace() - Ersetzt eine bestimmte Zeichenfolge innerhalb eines Strings
PS C:\>$("TEST").Replace("TE","ersetzt")

#.Substring() - Ersetzt Teile eines Strings anhand derer Position
PS C:\>$("TEST").Substring("1")
# 1 ... nach dem ersten Zeichen - Ausgabe "EST"
# 2. Beispiel:
# Ersetzt Teile eines Strings an mehreren Positionen
PS C:\>$("TEST").Substring("1","2") 
# 1 ... nach dem ersten Zeichen & 2 Nach dem  zweiten Zeichen - Ausgabe "ES"

Wenn nur die Endposition verwendet wird, kann dies auch so aussehen:

PS C:\>$("TEST").Substring("","3")
# Ausgabe: TES

#.TrimStart() - Entfernt bestimmte Zeichen zu Beginn des Strings:
PS C:\>$("TEST").TrimStart("TE")
# Ausgabe: ST
Tags: CSV, Powershell, String manipulieren, Windows
Durchschnittliche Bewertung: 0 (0 Abstimmungen)

Es ist möglich, diese FAQ zu kommentieren.