Compress-Archive: ZIP-Dateien erstellen und entpacken mit PowerShell

    ZIP-Archiv erstellenWährend PowerShell in der Vergangenheit ZIP-Dateien nur auf Umwegen erstellen konnte, erhält sie in der Version 5.0 zwei eigene Cmdlets, um Dateien zu komprimieren und zu entpacken. Sie bieten zwar nicht den Funktionsumfang voll­wertiger Packer, reichen für die meisten Zwecke aber ohne Weiteres aus.

    PowerShell bietet vielfältige Möglichkeiten für das Datei-Management. Neben den Basisoperationen wie Kopieren, Verschieben, Umbenennen, etc. zählt dazu beispielsweise auch ein Set von Cmdlets, mit denen sich CSV- und XML-Dateien auswerten und manipulieren lassen. Für das Komprimieren und Entpacken von ZIP-Archiven fehlten bisher jedoch adäquate Mittel.

    Diese liefert PowerShell 5.0 mit den Cmdlets Compress-Archive und Expand-Archive nun nach. Sie stehen damit unter Windows 10 standardmäßig zur Verfügung. In früheren Versionen des Betriebssystems (7 und 8.x) muss man PowerShell 5.0 erst mit dem Windows Management Framework 5.0 nachrüsten, das aktuell jedoch erst als Preview vorliegt.

    Dateien in ZIP-Archiv komprimieren

    Übergibt man in der einfachsten Variante dem Cmdlet Compress-Archive die Namen der zu komprimierenden Dateien und des ZIP-Archivs, dann legt es Letzteres automatisch an:

    Compress-Archive -Path *.pdf -DestinationPath PDFs.zip

    Diese Langversion des Aufrufs kann man abkürzen, indem man die Namen der Parameter weglässt. Ihre Bedeutung ergibt sich durch ihre Position. Darüber hinaus fügt das Cmdlet die Endung .zip automatisch an, wenn man sie nicht angibt.

    Compress-Archive akzeptiert als Wert für den Parameter Path mehrere Dateien, Verzeichnisse oder Ausdrücke mit Wildcards, wenn man diese durch Kommata voneinander trennt:

    Compress-Archive *.pdf,*.xps PDFs.zip

    Wenn man ganze Verzeichnisbäume in eine ZIP-Datei packen möchte, dann ist dieses Vorgehen aber meistens zu umständlich. Das Cmdlet verfügt aber nicht über die Fähigkeit, Verzeichnisse rekursiv einzulesen. Daher muss man zu diesem Zweck zusätzlich die Dienste von Get-ChildItem bemühen:

    Get-ChildItem *.pdf,*.xps -Recurse|Compress-Archive -DestinationPath PDFXPS.zip

    Komprimierung festlegen, Archive aktualisieren

    Compress-Archive bietet noch zusätzlich die Möglichkeit, die Art der Komprimierung zu bestimmen. Dies erfolgt über den Parameter CompressionLevel, der die Werte Optimal, Fastest und NoCompression akzeptiert. Der Vorgabewert ist Optimal, und für NoCompression dürfte in der Regel kein Bedarf bestehen.

    Will man Dateien zu einem bestehenden Archiv hinzufügen, dann sorgt der Schalter Update dafür, dass ältere Versionen der betreffenden Dateien, die sich bereits im ZIP-Archiv befinden, durch neuere überschrieben werden.

    Keines der beiden Cmdlets gibt Auskunft darüber, welche Dateien es gerade verarbeitet.

    ZIP-Dateien entpacken

    Für die komplementäre Operation von Compress-Archive ist Expand-Archive zuständig. Seine Verwendung ist relativ einfach, da man ihm nur den Namen des ZIP-Archivs und des Zielverzeichnisses mitteilen muss, in dem es die Dateien entpacken soll:

    Expand-Archive -Path .\PDFs.zip -DestinationPath .\temp

    Auch hier ist die Angabe der Parameternamen optional, so dass man etwas Tipparbeit sparen kann. Im Unterschied zu Compress-Archive akzeptiert -Path jedoch in diesem Fall nur einen einzelnen Wert und verweigert die Interpretation von Wildcards. Will man mehrere ZIP-Files in einem Aufruf entpacken, dann muss man wieder Get-ChildItem zu Hilfe nehmen:

    Get-ChildItem *.zip | Expand-Archive -DestinationPath .\temp

    Sollte eine der entpackten Dateien im Ziel bereits existieren, dann kann man sie ohne weitere Nachfrage durch Verwendung des Schalters -Force überschreiben.

    Inhalt von ZIP-Archiven auflisten

    Ein Manko der zwei spartanischen Cmdlets besteht darin, dass sie über keine Funktion verfügen, um den Inhalt eines Archivs anzuzeigen. Da sie auch während des Komprimierens und Entpackens keinerlei Auskunft darüber geben, welche Dateien sie gerade verarbeiten, lässt sich keinerlei Output für das Auflisten der Dateien verwenden, etwa in Zusammenarbeit mit -WhatIf.

    Die einfachste Lösung besteht darin, den Explorer aus PowerShell zu starten. So würde

    start .\PDFs.zip

    den Inhalt des Archivs PDFs.zip in einem Explorer-Fenster anzeigen. Um diesen Befehl auf mehrere Dateien anzuwenden, benötigt man eine Schleife:

    Get-ChildItem *.zip | % {start $_}

    Möchte man den Inhalt einer ZIP-Datei unbedingt in PowerShell ermitteln, dann muss man dafür auf die .NET-Klasse io.compression.zipfile zurückgreifen. Während die Methode ExtractToDirectory dem Entpacken der Dateien dient, gibt OpenRead den Inhalt des Archivs aus.

    1 Kommentar

    Bild von Johannes Huber
    Johannes Huber sagt:
    5. Oktober 2015 - 9:52

    Guten Tag :)

    Wie sieht es mit einem Passwortschutz für die .zip aus?
    Ist das mit PS möglich ?
    Wenn ja, wie ?

    Danke im Voraus !