Entpacken Sie die Datei mit Powershell in Server 2012 Core

15

Ich muss eine Datei mit Powershell entpacken. Die typische Art und Weise, wie ich das von allen gesehen habe, ist die Automatisierung der Shell mit einem Skript.

$shellApplication = new-object -com shell.application
$zipPackage = $shellApplication.NameSpace($zipfilename)
$destinationFolder = $shellApplication.NameSpace($destination)
$destinationFolder.CopyHere($zipPackage.Items())

Dies wird für mich nicht funktionieren, da der Server Core keine Shell hat und es keine gibt, die automatisiert werden kann. Dies gibt einen E_FAIL COM-Fehler.

Powershell scheint nicht in der Lage zu sein, dies selbst zu tun, und wenn ich zu einem Drittanbieter werde, muss ich erst eine Möglichkeit finden, das Dienstprogramm per Skript auf den Server zu bringen. 7-Zip war meine Anlaufstelle, aber es scheint nicht so, als könnte ich den Download und die Installation per Skript ausführen. Sourceforge spuckt mir immer wieder HTML-Dateien zurück.

Wie kann ich eine Zip-Datei in Server 2012 Core vollständig per Skript entpacken?

vcsjones
quelle
Was ist mit der Anforderung, 7zip von SF herunterzuladen? Wy können Sie nicht von einer internen Quelle installieren / kopieren?
Longneck
@longneck Das PS-Skript, das ich produziere, wird den Kunden ausgehändigt. Das Skript muss also vollständig in sich geschlossen sein. Ich könnte selbst ein Zip-Dienstprogramm hosten, aber das ist ein weiteres Problem, das ich nicht möchte (legal). Ich hatte nur gehofft, dass es ein einfaches Cmdlet gibt, das dies ermöglicht. Es wurde 2012 eingeführt.
vcsjones 8.11.12
Wenn Sie Kunden etwas aushändigen, warum nicht ein selbstextrahierendes Archiv erstellen?
Zoredache
@Zoredache Nun, das schien anfangs mehr Arbeit zu sein (unser Build-System erstellt bereits ZIPs), ich hatte gehofft, dass es nur "ganz schnell" gehen würde.
vcsjones

Antworten:

24

Server 2012 wird mit Dot.NET 4.5 geliefert, das über System.IO.Compression.ZipFile verfügt, das über eine ExtractToDirectory-Methode verfügt. Sie sollten dies von PowerShell aus verwenden können.

Hier ist ein Beispiel.

Zuerst müssen Sie die Assembly laden, in der sich ZipFile befindet:

[System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") | Out-Null

Dann extrahieren Sie den Inhalt

[System.IO.Compression.ZipFile]::ExtractToDirectory($pathToZip, $targetDir)

Bearbeiten: Wenn Sie auf PowerShell 5 (Windows Management Framework 5.0) aktualisiert haben, haben Sie endlich native Cmdlets:

Expand-Archive $pathToZip $targetDir
Peter Hahndorf
quelle
Ich habe gerade System.IO.Compression durchgesehen und ZipFile ist nicht da. Gibt es ein Update auf 4.5, das es hinzufügt?
Mike
Es scheint, dass dies in 4.5 eingeführt wurde, aber in 4.0 nicht vorhanden ist. Wenn Sie 4.5 haben, sollten Sie es haben.
Peter Hahndorf
6
Es ist verdammt Zeit, dass es eine native Lösung dafür gibt.
MDMarra