Décompressez le fichier avec Powershell dans Server 2012 Core

15

J'ai besoin de décompresser un fichier avec PowerShell. La façon typique dont j'ai vu tout le monde faire cela est d'automatiser le shell avec un script.

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

Cela ne fonctionnera pas pour moi, car Server Core n'a pas de shell, donc il n'y en a pas à automatiser. Cela donne une erreur E_FAIL COM.

Powershell ne semble pas être capable de le faire par lui-même, et si je choisis un tiers, je dois d'abord trouver un moyen de créer un script pour obtenir l'utilitaire sur le serveur. 7-Zip était mon choix, mais il ne semble pas que je puisse scripter le téléchargement et l'installation de celui-ci. Sourceforge continue de me cracher des fichiers HTML.

Comment puis-je complètement décompresser un fichier zip dans Server 2012 Core?

vcsjones
la source
Quelle est l'exigence de télécharger 7zip depuis SF? Vous ne pouvez pas installer / copier à partir d'une source interne?
longneck
@longneck Le script PS que je produis va être distribué aux clients; le script doit donc être entièrement autonome. Je pourrais héberger un utilitaire zip nous-mêmes, mais c'est un autre casse-tête que je ne veux pas (jargon juridique). J'espérais juste qu'il y avait une simple applet de commande qui pourrait faire cela qui a été introduite en 2012.
vcsjones
Si vous distribuez quelque chose aux clients, pourquoi ne pas créer une archive auto-extractible?
Zoredache
@Zoredache Eh bien, cela semblait être plus de travail au départ (notre système de construction construit déjà des ZIP), j'espérais que ce serait "très rapide".
vcsjones

Réponses:

24

Server 2012 est livré avec Dot.NET 4.5 qui a System.IO.Compression.ZipFile qui a une méthode ExtractToDirectory. Vous devriez pouvoir l'utiliser à partir de PowerShell.

Voici un exemple.

Vous devez d'abord charger l'assembly ZipFile se trouve dans:

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

Extraire ensuite le contenu

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

Modifier: si vous avez mis à jour vers PowerShell 5 (Windows Management Framework 5.0), vous disposez enfin d'applets de commande natives:

Expand-Archive $pathToZip $targetDir
Peter Hahndorf
la source
Je viens de parcourir System.IO.Compression et ZipFile n'est pas là. Existe-t-il une mise à jour vers 4.5 qui l'ajoute?
Mike
Il semble que cela ait été introduit dans 4.5, mais pas présent dans 4.0. Si vous en avez 4.5, vous devriez l'avoir.
Peter Hahndorf
6
Il est à peu près temps qu'il existe une solution native pour cela.
MDMarra