265 votes

Comment créer une archive zip avec PowerShell ?

Est-il possible de créer une archive zip à l'aide de PowerShell ?

0 votes

Un échantillon avec le code source complet ?

259voto

Eld Points 1245

Une pure alternative à PowerShell qui fonctionne avec PowerShell 3 et .NET 4.5 (si vous pouvez l'utiliser) :

function ZipFiles( $zipfilename, $sourcedir )
{
   Add-Type -Assembly System.IO.Compression.FileSystem
   $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
   [System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir,
        $zipfilename, $compressionLevel, $false)
}

Il suffit de saisir le chemin complet de l'archive zip que vous souhaitez créer et le chemin complet du répertoire contenant les fichiers que vous souhaitez compresser.

1 votes

Est-ce que cela nécessite vraiment Powershell 3.0, ou juste .net 4.5 ? Il me semble qu'il n'y a pas beaucoup de fonctionnalités de Powershell, il s'agit plutôt de programmation .net.

0 votes

@bwerks voir la partie "modifier". aquí

0 votes

Je cherchais un moyen de compresser un seul gros fichier, mais apparemment il n'existe pas de méthode pour cela. J'ai dû écrire un code qui créait un nouveau répertoire, y copiait le fichier unique, compressait ce répertoire dans un nouveau fichier zip, puis supprimait le répertoire pour faire le ménage.

125voto

Matt Hamilton Points 98268

Si vous vous rendez sur CodePlex et que vous attrapez la Extensions communautaires PowerShell vous pouvez utiliser leur write-zip cmdlet.

Desde

CodePlex est en mode lecture seule en vue de sa fermeture.

vous pouvez aller à Galerie PowerShell .

122 votes

Oui, et il utilise 7z comme bibliothèque principale pour la plupart de ses cmdlets de compression. Je le sais, car je l'ai implémenté ;) +1

1 votes

Lol, bon travail, x0n. J'ai imlpementé le fournisseur de magasin d'alimentation dans PSCX. Un peu moins pratique mais très amusant :)

1 votes

S'il utilise 7z, est-il possible de zipper en utilisant un mot de passe ?

57voto

sonjz Points 926

Un moyen natif avec le dernier cadre .NET 4.5, mais entièrement dépourvu de fonctionnalités :

Création :

Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::CreateFromDirectory("c:\your\directory\to\compress", "yourfile.zip") ;

Extraction :

Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::ExtractToDirectory("yourfile.zip", "c:\your\destination") ;

Comme mentionné, totalement dépourvu de fonctionnalités, ne vous attendez donc pas à une écraser drapeau.

MISE À JOUR : Voir ci-dessous pour d'autres développeurs qui ont développé ce sujet au fil des ans...

0 votes

Pourquoi utiliser la méthode sans caractéristiques ?

0 votes

Il s'agit de la réponse acceptée dans l'ordre de la date de publication et du précédent. Quant à votre commentaire mis à jour, il y a vraiment un grand nombre de façons de le faire maintenant. Je suis confronté au besoin de cette fonctionnalité et je suis sur PowerShell 4, la première chose que j'ai trouvée est la méthode native. C'était une bonne question en 2009. Je pense toujours qu'il aurait été possible de présenter des recherches plus approfondies dans la question posée à l'origine.

46voto

Recursieve Points 1162

Installez 7zip (ou téléchargez plutôt la version en ligne de commande) et utilisez cette méthode PowerShell :

function create-7zip([String] $aDirectory, [String] $aZipfile){
    [string]$pathToZipExe = "$($Env:ProgramFiles)\7-Zip\7z.exe";
    [Array]$arguments = "a", "-tzip", "$aZipfile", "$aDirectory", "-r";
    & $pathToZipExe $arguments;
}

Vous pouvez l'appeler comme ça :

create-7zip "c:\temp\myFolder" "c:\temp\myFolder.zip"

6 votes

Si 7zip est dans votre chemin, tout ce que vous devez écrire est "& 7z c : \temp\myFolder c : \temp\myFolder.zip "

5 votes

Si vous ne voulez pas l'installer, vous pouvez télécharger la version en ligne de commande à la place. (Il suffit de regarder sur la page de téléchargement de 7-zip.) C'est juste un exécutable, et la syntaxe de la commande est la même. L'exécutable a un nom différent, cependant ; c'est 7za.exe pour une raison quelconque. J'ai fait cela sur un certain nombre de projets et je n'ai jamais été déçu.

0 votes

J'ai essayé avec .net et les outils Powershell pendant trop longtemps jusqu'à ce que j'emprunte la voie de 7zip qui a fonctionné immédiatement. Une simple boucle foreach sur $file fait l'affaire. & "C:\Program Files\7-Zip\7z.exe" a -tzip ($file.FullName+".zip") $file.FullName

15voto

noam Points 648

Deuxième édition - Ce code est un vilain, vilain kluge des temps anciens. Vous n'en voulez pas.

Ceci compresse le contenu de .\in a .\out.zip avec System.IO.Packaging.ZipPackage en suivant l'exemple aquí

$zipArchive = $pwd.path + "\out.zip"
[System.Reflection.Assembly]::Load("WindowsBase,Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")
$ZipPackage=[System.IO.Packaging.ZipPackage]::Open($zipArchive,
  [System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite")
$in = gci .\in | select -expand fullName
[array]$files = $in -replace "C:","" -replace "\\","/"
ForEach ($file In $files)
{
   $partName=New-Object System.Uri($file, [System.UriKind]"Relative")
   $part=$ZipPackage.CreatePart($partName, "application/zip",
      [System.IO.Packaging.CompressionOption]"Maximum")
   $bytes=[System.IO.File]::ReadAllBytes($file)
   $stream=$part.GetStream()
   $stream.Write($bytes, 0, $bytes.Length)
   $stream.Close()
}
$ZipPackage.Close()

Editar: Peu fiable pour les fichiers plus importants, peut-être >10mb, YMMV. Quelque chose à faire avec une preuve de domaine d'application et un stockage isolé. La version 4.5 de .NET, plus conviviale approche fonctionne bien à partir de PS v3, mais je voulais plus de mémoire dans mon cas. Pour utiliser .NET 4 à partir de PS v2, les fichiers de configuration doivent être modifiés. non pris en charge tweak .

0 votes

Le problème majeur de ZipPackage est qu'il n'est pas normal ZIP mais contient un fichier xml de contenu. voir : [comment éviter [Content_Types].xml dans la classe ZipPackage de .net - Stack Overflow]( stackoverflow.com/questions/3748970/ )

0 votes

@aaron Une raison de plus pour ne plus jamais l'utiliser ! Vous avez une rude concurrence pour "le problème majeur" ici ;)

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X