ZIP-Dateien mit Powershell Bordmitteln erzeugen und bearbeiten


Der Artikel http://serverfault.com/questions/18872/how-to-zip-unzip-files-in-powershell beschreibt folgende Methode um eine ZIP-Datei per Powershell oder Zusatztools zu entpacken. Sehr praktisch.

Entpacken

$shell = New-Object –ComObject Shell.Application
$zip = $shell.Namespace("C:\temp\meineZipDatei.ZIP")
$dest = $shell.Namespace("C:\temp")
$dest.CopyHere($zip.items())

Interessant ist bei CopyHere den 2. Parameter zu verwenden, mit diesem kann man unterschiedliche Verhaltensweisen realisieren. Weitere Infos zu möglichen Werten stehen hier: http://msdn.microsoft.com/en-us/library/bb787866(v=vs.85).aspx.

So entpackt z. B. dieser Befehl und überschreibt immer bereits vorhandene Zieldateien:

$dest.CopyHere($zip.items(),16)

Möchte man wissen, welche Dateien in einer ZIP-Datei enthalten sind, kann man auf die Items()-Methode zurückgreifen. So gibt diese Zeile alle enthaltenen Dateien aus:

$zip.items()

Allerdings bekommt man ein Problem, wenn man auf eine einzelne Datei zurückgreifen möchte:

$zip.items()[0]

führt zu der Fehlermeldung:

Index in einem Objekt vom Typ "System.__ComObject" kann nicht erstellt werden.
Bei Zeile:1 Zeichen:19
+ $zip_file.items()[ <<<< 0]
    + CategoryInfo          : InvalidOperation: (0:Int32) [], RuntimeException
    + FullyQualifiedErrorId : CannotIndex

Hier hilft ein umpacken mittels dem @-Operator, in der deutschen Technethilfe Arrayteilausdruckoperator genannt (http://technet.microsoft.com/de-de/library/dd315313.aspx) im englischen wird er “array subexpression operator” genannt:

@($zip.items())[0]

Näheres zum @(…) Operator findet man hier: http://blogs.msdn.com/b/powershell/archive/2007/01/23/array-literals-in-powershell.aspx. Den @-Operator muss man sich merken, denn er wird häufiger im Zusammenhang mit COM-Objekten benötigt.

Neue, Leere ZIP-Datei erstellen
Mit einem kleinen Trick kann man auch neue ZIP-Dateien kreieren indem man einfach eine Datei mit einem ZIP-Header anlegt und diese anschließend mit obigen Befehlen öffnet (gesehen bei http://poshcode.org/411):

$zipHeader=80,75,5,6,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
$fmode=[System.IO.FileMode]::Create
$emptyZip=new-object -type System.IO.FileStream "C:\temp\Test.ZIP", $fmode
$emptyZip.Write($zipHeader,0,22)
$emptyZip.Flush()
$emptyZip.Close()

Dateien zu ZIP-Datei hinzufügen
Nun kann man der neuen ZIP-Datei mittels eines einfachen CopyHere Befehls weitere Dateien hinzufügen:

$shell=New-Object -ComObject Shell.Application
$zip=$shell.Namespace("C:\temp\test.zip")
$zip.Copyhere("C:\temp\Sample.txt")

Wermutstropfen: So toll die ganze Geschichte auch ist, einen Haken gibt es. Der Microsoft Hyper-V 2008 R2 Server bringt leider keine Namespace Unterstützung für ZIP-Dateien mit. So dass obiges auf diesem Server leider nicht anwendbar ist.

4 Antworten to “ZIP-Dateien mit Powershell Bordmitteln erzeugen und bearbeiten”

  1. Quirel Says:

    Der Mann hatte den gleichen Gedanken und hat alles vollständig umgesetzt, inkl Cmdlets zum Hinzufügen und Entpacken! http://commandlinegeeks.com/2011/03/05/from-ps-to-zip/

  2. PowerShell ZIP ohne Module oder externe Programme - PowerShell Get-Script -Name Peter Kriegel | Management Says:

    […] https://newyear2006.wordpress.com/2011/05/20/zip-dateien-mit-powershell-bordmitteln-erzeugen-und-bear… […]

  3. ePUB Automator unter Windows mit Notepad++ Says:

    […] Zip-Dateien mit Powershell Bordmitteln erzeugen (deutsch) […]

  4. Quirel Says:

    http://huddledmasses.org/a-new-way-to-zip-and-unzip-in-powershell-3-and-net-4-5/

Schreibe einen Kommentar

Trage deine Daten unten ein oder klicke ein Icon um dich einzuloggen:

WordPress.com-Logo

Du kommentierst mit Deinem WordPress.com-Konto. Abmelden / Ändern )

Twitter-Bild

Du kommentierst mit Deinem Twitter-Konto. Abmelden / Ändern )

Facebook-Foto

Du kommentierst mit Deinem Facebook-Konto. Abmelden / Ändern )

Google+ Foto

Du kommentierst mit Deinem Google+-Konto. Abmelden / Ändern )

Verbinde mit %s


%d Bloggern gefällt das: