Tags: Datei-Management, PowerShell
Für die Auswertung von Log- oder CSV-Dateien ist es manchmal erforderlich, dass man diese in einer Datei zusammenführt. Auch beim Kopieren von mehreren Dateien in ein Zieldokument bietet PowerShell mehr Möglichkeiten als der alte Kommando-Interpreter.
Obwohl die Konkatenation von Dateien explizit auch für binäre Dateien unterstützt wird, macht sie in der Regel nur Sinn, wenn ihr Inhalt aus Text besteht. Wesentliche Herausforderungen beim Zusammenfügen von Textdateien sind die Beibehaltung der richtigen Reihenfolge sowie des gewünschten Zeichensatzes.
Copy und Type unter cmd.exe
Unter cmd.exe stehen für diese Aufgabe hauptsächlich die Befehle copy und type in Kombination mit einem Redirect zur Verfügung:
type log_*.txt > gesamt.log
Hier gerät die Reihenfolge der Dateien gerne durcheinander, weil man keine Kontrolle darüber hat, wie der Kommandoprozessor das Wildcard auflöst. Das Gleiche gilt bei der Verwendung von copy, aber dort hat man die Möglichkeit, die Dateien einzeln über den Plus-Operator aneinanderzuhängen:
copy log_1.3.2016.txt + log_2.3.2016.txt gesamt.log
Get-Content plus Redirect in PowerShell
In PowerShell kann man ebenfalls die einfache Methode wählen, indem man Dateien mit Hilfe von Get-Content anzeigt und den Output in eine Zieldatei umleitet:
Get-Content log_*.txt > gesamt.log
Auch hier stellt sich das Problem, dass die kopierten Dateien wahrscheinlich nicht in der gewünschten Reihenfolge aneinandergehängt werden. Get-Content kann diese nicht beeinflussen, aber Get-ChildItem und Sort-Object sind in der Lage, ihm eine sortierte Liste zu liefern:
Get-Content (gci log_* | sort CreationTime) > gesamt.log
Anstelle der Sortierung nach Erstellungszeit könnte man hier auch BaseName oder Length als Kriterium wählen.
Lassen sich die Quelldateien über keine Sortierung in die richtige Reihenfolge bringen, dann kann man sie immer noch von Hand als kommaseparierte Liste eingeben:
Get-Content log_29.2.2016.txt, log_1.3.2016.txt, log_2.3.2016.txt > gesamt.log
Ausgabe mit Set-Content oder Add-Content
Bei der Ausgabe der Quelldateien muss man sich nicht auf den Redirect-Operator beschränken, vielmehr kann man dafür auch die Cmdlets Set-Content und Add-Content nutzen. Ihr Einsatz ist etwa dann interessant, wenn man den Zeichensatz des Inhalts vor dem Schreiben in die Zieldatei festlegen möchte:
Get-Content log_29.2.2016.txt, log_1.3.2016.txt | Set-Content gesamt.log -Encoding ASCII
Erwartungsgemäß überschreibt Set-Content eine eventuell bestehende Datei gleichen Namens, während Add-Content den neuen Inhalt an sie anhängen würde.
Täglich Know-how für IT-Pros mit unserem Newsletter
Verwandte Beiträge
Weitere Links
1 Kommentar
"...kopierten Dateien wahrscheinlich nicht in der gewünschten Reihenfolge aneinandergehängt werden."
Soweit ich experimentell feststellen konnte, wird nach Name+Erweiterung sortiert. Genau wie bei copy in der cmd.exe. Das ist die Sortierung, die ich beim Zusammenfügen bisher immer brauchte und ohne weiteres Zutun immer bekommen habe.