•  
  •  

ZIP Kompression mit der PowerShell; eine Übersicht.

Die Windows PowerShell hat leider keine Cmdlets um Dateien zu Komprimieren.
Ich stelle hier eine Übersicht über die Möglichkeiten zusammen, wie man mit der Windows PowerShell ZIP-Dateien erstellt.
Zuerst erwähne ich Möglichkeiten wie man ohne zusätzliche Hilfsmittel auskommt.
Zum Schluss zeige ich noch Möglichkeiten auf wie man die Windows PowerShell und 7-ZIP oder andere zusätzlichen DLLs (.dll) nutzen kann.

Das ZIP-Dateiformat

Das ZIP-Dateiformat (von englisch zipper ‚Reißverschluss‘) ist ein Standard um die Menge digitaler Daten von Dateien aus dem Dateisystem zu reduzieren.
ZIP reduziert die Menge digitaler Daten von einer Datei durch einen standardisierten Datenkompressionsalgorithmus (Datenkomprimierung).

Das ZIP-Dateiformat reduziert durch die Kompression den Platzbedarf von Dateien und wird deshalb auch benutzt um Dateien zu Archivieren.
Durch die reduziert Menge digitaler Daten werden Dateiübertragungen verkürzt und dadurch Kostengünstiger.
Das ZIP-Dateiformat fungiert auch als Containerdatei, in der mehrere zusammengehörige Dateien oder auch ganze Verzeichnisbäume zusammengefasst werden können. Dies wird meist als ZIP-Paket bezeichnet, da dadurch ganze Verzeichnisbäume in einer Datei verschickt werden können.
Die Dateiendung für ZIP-Dateien ist .zip. Der MIME-Typ ist application/zip.

Die Wörter „komprimieren“, „zippen“ oder „packen“ werden als Synonym für das zusammenstellen von Dateien in eine ZIP-Datei verwendet.

Siehe Wikipedia ZIP-Dateiformat: http://de.wikipedia.org/wiki/ZIP-Dateiformat

ZIP Kompression mit der PowerShell

Es ist nicht einfach mit der PowerShell Dateien oder ganze Ordner mit dem ZIP Algorithmus zu einem Paket zu Komprimieren.
Ich bin immer ein großer Fan davon, ohne dritt Anbieter Tools und nur mit Windows Bordmitteln, eine Aufgabe zu erledigen. Doch dies ist in diesem fall nicht so einfach.

ZIP Kompression mit der PowerShell 2.0

Bei den Bordmitteln ist man mit der  Windows PowerShell 2.0 noch etwas eingeschränkter, da die Windows PowerShell 2.0 nur die .NET Frameworks 2.0 bis 3.5 nutzen kann.

Hier kann man z.B. das COM Objekt „Shell.Application“ von dem Windows Datei-Explorer benutzen.
Oder man kann die .NET Klasse System.IO.Packaging.ZipPackage aus der WindowsBase Assembly (.dll) nutzen.

Oder man nutzt ein vorhandenes Packprogramm wie z.B.
7-ZIP (oder die 7z.dll davon) oder eine andere Library (.dll) die ZIP-Funktionen bietet wie z.B. die SharpZipLib.dll von http://www.icsharpcode.net/OpenSource/SharpZipLib/

ZIP Kompression mit der PowerShell 3.0 und folgend

Die PowerShell 3.0 und folgend bietet alle Möglichkeiten der PowerShell 2.0.

Ab der Windows PowerShell 3.0 kann man das .NET Framework 4.0 und 4.5 benutzen.

Der Namensraum „System.IO.Compression“ vom .NET  Framework 4.5 enthält nun neue Klassen zum erstellen von ZIP Komprimierten Paket-Dateien.

ZIP Kompression mit der PowerShell 4.0

Seit der PowerShell 4.0 kann man die „Archive“ Rescource der  Desired State Configuration (DSC) zur Arbeit mit ZIP-Dateien benutzen.

ZIP Kompression mit der PowerShell 5.0

Die PowerShell 5.0 bekommt nun endlich eigenen Cmdlets um ZIP-Dateien zu erstellen
Die Cmdlets heissen in der Aktuellen Preview Version:

  • Compress-Archive
  • Expand-Archive

Boe Prox hat einen Blog Post zur Benutzung von diesen ZIP-Cmdlets geschrieben:
More New Stuff in PowerShell V5: Expand and Compress Archive Cmdlets
http://learn-powershell.net/2014/08/23/more-new-stuff-in-powershell-v5-expand-and-compress-archive-cmdlets/

Das COM Objekt Shell.Application

Wie man „Shell.Application“ COM Objekt benutzt habe ich in meinem Artikel PowerShell ZIP ohne Module oder externe Programme http://www.admin-source.de/BlogDeu/450/powershell-zip-ohne-module-oder-externe-programme beschrieben.
Leider unterstützt das „Shell.Application“ COM Objekt keine Kommunikation mit der Windows PowerShell, sodass die Windows PowerShell nicht weiß wann ein Kompressionsvorgang abgeschlossen ist.
Diese asynchronität wirft viele (unlösbare) Probleme auf.
Ebenso kann man hier nicht so leicht Verzeichnisbäume in einem ZIP Paket erstellen, dies ist schwer zu handhaben.
Deshalb kann ich diese Methode nicht Empfehlen und rate dazu dies nur im Notfall zu benutzen.

Die .NET Klasse System.IO.Packaging.ZipPackage

Die .NET Klasse System.IO.Packaging.ZipPackage aus der WindowsBase Assembly (.dll), setzt das .NET Framework 3.5 voraus.
Diese Klasse ist eigentlich dazu gedacht Microsoft Office Dokument (.docx, .xlsx, pptx usw.) zu erstellen.
Deshalb erstellt diese Klasse keine „sauberen“ .zip Dateien.
Die Vorgehensweise wie man mit dieser .NET Klasse .zip Dateien erstellt kann man in den folgenden Blog Posts nachlesen:

PowerShell–Zip
http://thewalkingdev.blogspot.de/2012/07/powershellzip.html

Easy archiving of files using PowerShell
http://www.winsoft.se/2010/12/easy-archiving-of-files-using-powershell/

oder hier auf Stackoverflow:
http://stackoverflow.com/a/12978117/1165195

Auch diese Klasse hat ihre Nachteile. Sie erzeugt z.B. ungewollte Bestandteile (eine [Content_Types].xml Datei) in dem ZIP-Paket.
Auch hier muss man Verzeichnisbäume in einem ZIP Paket selbst  erstellen und verwalten, dies ist ebenfalls schwer zu handhaben. Wie man Verzeichnisse innerhalb dieser ZIP-Date verwaltet, macht habe ich in meiner Beschreibung zum .xlsx Format erklärt (englisch):
http://gallery.technet.microsoft.com/scriptcenter/Export-XLSX-PowerShell-f2f0c035

Man kann über Reflection die privaten Methoden der Klassen benutzen um saubere ZIP-Dateien zu erstellen.
C# Use Zip Archives without External Libraries
http://www.codeproject.com/Articles/209731/Csharp-use-Zip-archives-without-external-libraries

Auch diese Vorgehensweise ist eher ein Notnagel.

Der .NET Namensraum „System.IO.Compression“ in der Windows PowerShell

Ab PowerShell 3.0 kann man das .NET Framework 4.5 nutzen, das den Namensraum „System.IO.Compression“ enthält. Dieser Namensraum stellt neue Klassen zum erstellen von ZIP Komprimierten Paket-Dateien bereit.

Folgend hier ein Beispiel, wie man sehr leicht mit der Klasse System.IO.Compression.ZipFile einen ganzen Ordner in eine ZIP-Datei einpacken kann.

Joel Bennett hat mit dem .NET 4.5 Namensraum „System.IO.Compression“ und den darin enthaltenen .NET Klassen 2 Windows PowerShell Script-Cmdlets entwickelt. Die man auf Poshcode herunterladen kann.
ZipFile Module by Joel Bennett
http://poshcode.org/4198

Alexey Miasoedov hat diese 2 Script-Cmdlets weiterentwickelt. Den Code dazu kann man sich hier herunterladen.
Manage Zip archives with PowerShell by Alexey Miasoedov
http://purple-screen.com/?p=440

Windows PowerShell und 7-ZIP

Um mit 7-ZIP ZIP-Dateien zu erstellen muss 7-ZIP auf dem Rechner vorher Installiert werden oder man benötigt die 7z.dll. Dieser vermeidliche Nachteil bringt viele Vorteile mit sich. Mit 7-ZIP ist es wesentlich leichter Verzeichnisbäume zu verarbeiten, vorhandene .zip Dateien zu Aktualisieren (Update) oder die Integrität einer ZIP-Datei zu überprüfen. Ebenso kann 7-ZIP auch andere Kompressionsformate entpacken.

Auf DotnetPerls findet man Beispiele (Examples) zur Benutzung von 7z.exe mit Kommandozeilen-Parametern.
7z.exe Examples: http://www.dotnetperls.com/7-zip-examples

Hinweis:
Bei der Nutzung von 7-ZIP kommt ein Windows PowerShell 2.0 Bug zum Vorschein.
Kommandos die, wie 7-Zip.exe, mit einer Nummer beginnen, müssen mit dem Call Operator & aufgerufen werden. Hier sollte man die Hinweise aus dem Artikel „Mehrere Arten mit der PowerShell ein externes Programm zu starten“ http://www.admin-source.de/BlogDeu/791/mehrere-arten-mit-der-powershell-ein-externes-programm-zu-starten beherzigen.
Ab PowerShell 3.0 tritt dieser Bug nicht mehr auf!

Folgend ein Beispielaufruf von 7z.exe mit der PowerShell, um alle Dateien und Ordner von „D:\temp“ in die in eine ZIP-Datei zu mit dem Namen „D:\temp\backup.zip“ zu verpacken.

Das steuern der 7z.exe hat den Nachteil das die Aktionsmeldungen (Error, Erfolg, Fortschritt) von 7z.exe als Text an PowerShell übergeben werden.
Um auch hier echte Objekte und mehr Kontrolle zu bekommen, gibt es ein Projekt das „SevenZipSharp“ heißt und die 7z.dll von 7-ZIP auch für .NET nutzbar macht.
https://sevenzipsharp.codeplex.com/

Thomas Freudenberg zeigt in einem Blog-Post wie man SevenZipSharp mit Windows PowerShell nutzt um ZIP-Dateien zu bearbeiten:
http://thomasfreudenberg.com/blog/archive/2013/04/07/7-zip-for-powershell.aspx

Das sehr gute Windows PowerShell Modul „PowerShell Community Extensions“ (PSCX) bietet ZIP Cmdlets die intern die auch SevenZipSharp  und 7z.dll von 7-ZIP benutzen.

Das PSCX Modul gibt es für die PowerShell 2.0 (.NET 2.0 -3.5) und für die PowerShell 3.0 (.NET 4.0)
Download PSCX Modul: https://pscx.codeplex.com/

Windows PowerShell und SharpZipLib

Hier benötigt man die SharpZipLib von http://www.icsharpcode.net/OpenSource/SharpZipLib/

Lee Holmes hat ein Beispiel geposted wie man die SharpZipLib mit der PowerShell nutzen kann um ZIP-Dateien zu bearbeiten:
http://poshcode.org/2202

Ein weiteres Beispiel mit Windows PowerShell und der SharpZipLib findet man hier:
PowerShell SharpZipLib Script
http://blog.expressionsoftware.com/2009/11/powershell-sharpziplib-script.html

Anmerkung:
Eine Nutzung von den .NET Framework 4.0 und 4.5 mit Windows PowerShell 2.0  ist auch Möglich, verursacht aber wieder andere Probleme und wird von Microsoft nicht unterstützt.
Siehe:
https://connect.microsoft.com/PowerShell/feedback/details/525435/net-4-0-assemblies-and-powershell-v2
und
http://stackoverflow.com/questions/2094694/how-can-i-run-powershell-with-the-net-4-runtime/5069146#5069146

Mein Fazit

Wenn man keine zusätzlichen Tools benutzen kann und PowerShell 2.0 abwärtskompatibel bleiben will, sollte man sich mit der .NET Klasse System.IO.Packaging.ZipPackage näher beschäftigen. Das .NET Framework 3.5 vorausgesetzt!

Muss man viel mit Dateibäumen arbeiten oder man legt wert auf eine Integritätsprüfung, so empfehle ich den Umgang mit einer der 7-ZIP Derivate.

 

The following two tabs change content below.
Profile photo of Peter Kriegel

Peter Kriegel

IT Professionell, SysAdmin
Ich arbeite mit Computern seit 1984 (Comodore Amiga war mein erster). Seit dem Jahr 1990 Programmiere ich in C,C++ und Basic Sprachen. Seit dem Jahr 2000 bin ich Computer Administrator. In diesem Jahr habe ich die Prüfungen für den Microsoft Certified System Administrator MCSA 2000 absolviert. Als System Administrator benutze ich VBScript ,DOS Batches, Office VBA. Seit 2005 Programmiere ich mit Visual Basic .NET (VB.NET) (.NET V2). Dort entwickle ich Datenbank-Bedienungsoberflächen für den Microsoft SQL Server (GUI Frontend). PowerShell benutze ich seit 2009. In einem sehr großen Active Directory (> 100000 Workstations) verwalte ich (und meine 9 Kollegen) ca. 3000 Windows Clients, die in 37 OUs geordnet sind.

One thought on “ZIP Kompression mit der PowerShell; eine Übersicht.

Kommentar verfassen