Mehrere Dateien aneinanderhängen mit PowerShell

    Dateien zusammenhängen mit PowerShellFü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 Kommando­prozessor 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 aneinander­gehä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.

    1 Kommentar

    Bild von DaMa
    DaMa sagt:
    13. März 2017 - 8:48

    "...kopierten Dateien wahrscheinlich nicht in der gewünschten Reihenfolge aneinander­gehä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.