Comment pouvez-vous compresser ou décompresser le script en utilisant UNIQUEMENT les capacités intégrées de Windows?


294

Sous Windows, vous pouvez compresser certains fichiers en

clic droit → Envoyer versDossier compressé (zippé)

Et décompressez en double-cliquant sur le .zipfichier et extrayez les fichiers.

Existe-t-il un moyen d'appliquer ces capacités à partir d'un script (fichier .bat) sans avoir à installer de logiciel tiers ?



16
Eh bien, c'est probablement pour l'appeler à partir d'un fichier batch ou d'un programme. (C'est pourquoi je suis ici - essayant de créer un fichier .BAT rapide pour "construire" un petit produit pour un site Web qui nécessite qu'il soit un fichier zip.)
Jon Coombs

46
C'est fou que cette question soit close.
Sam Goldberg

1
Est-il possible de déplacer cette question vers Super User?
Hanxue

21
Toujours très utile et pertinent en 2018.: P
Michael Fever

Réponses:


82

En 2013, ce n'était pas possible. Microsoft n'a fourni aucun exécutable pour cela.

Voir ce lien pour une façon VBS de le faire. /superuser/201371/create-zip-folder-from-the-command-line-windows

À partir de Windows 8, .NET Framework 4.5 est installé par défaut, avec System.IO.Compression.ZipArchive et PowerShell disponibles, on peut écrire des scripts pour y parvenir, voir https://stackoverflow.com/a/26843122/71312


1
Ce n'est pas correct étant donné que PS le permet et est préinstallé sur Windows et est disponible via la ligne de commande.
Dan Atkinson

4
@DanAtkinson Mis à jour. Il a été répondu en 2013, le lien a fourni un moyen VBS. La manière PS a besoin de .Net 4.5, qui a besoin de Windows 8 ou plus.
Diryboy

Merci pour la mise à jour! J'ai modifié mon vote en conséquence. :)
Dan Atkinson

6
@MichaelMrozek Eh bien, la "ligne de commande" se réfère de manière générique à n'importe quelle ligne de commande, pas spécifiquement CMD / COMMAND, et PS est définitivement une ligne de commande, tout comme bash, sh, rsh sur * nix. Mais juste pour aller plus loin, puisque vous pouvez exécuter powershell à partir de la ligne de commande, cela répond à la question même si vous voulez croire que cmd / command est la seule et unique ligne de commande.
Robert McKee

1
Il était de retour possible en 2013 (sans installer aucun logiciel supplémentaire). Voir la question Super utilisateur . Cela est possible depuis la sortie de Windows XP en 2001. La fonctionnalité ZIP intégrée de Windows XP peut être exploitée car elle est exposée via une interface COM .
Peter Mortensen

180

Pour développer la solution PowerShell de Steven Penny, vous pouvez l'intégrer dans un fichier de commandes en appelant powershell.exe comme ceci:

powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar'); }"

Comme Ivan Shilo l'a dit, cela ne fonctionnera pas avec PowerShell 2, cela nécessite PowerShell 3 ou supérieur et .NET Framework 4.


1
En fait, cela a été rendu disponible dans .NET 4.5.
qJake

10
Pour ceux (comme moi) qui se demandent comment extraire dans le répertoire réel (au lieu de créer un nouveau répertoire), définissez simplement le paramètre cible '.', par exemple:powershell.exe -nologo -noprofile -command "& { Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.'); }"
Munchkin

Pouvons-nous utiliser ces commandes pour augmenter la compression? Comme faire de la compression Ultra pour réduire la taille du fichier?
Nigel Fds

1
Quel est le but de & {}? Avec PS5, cela fonctionne aussi:powershell.exe -nologo -noprofile -command "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', '.');"
Roi Danton

@RoiDanton Comment utiliser stringformatter pour définir src.zip et dest.zip?
PySaad

161

Depuis .NET 4.5 , PowerShell peut faire ceci:

Add-Type -A System.IO.Compression.FileSystem
[IO.Compression.ZipFile]::CreateFromDirectory('foo', 'foo.zip')
[IO.Compression.ZipFile]::ExtractToDirectory('foo.zip', 'bar')

Pour les deux dernières lignes, baret foopeut être remplacé par le nom que vous souhaitez que le dossier ait, ou quel que soit le nom du dossier préexistant. foo.zipdans les deux cas, sert de fichier zip pour enregistrer sous ou décompresser.


17
C'est à partir de .NET 4.5.
qJake

Pouvons-nous utiliser ces commandes pour augmenter la compression? Comme faire de la compression Ultra pour réduire la taille du fichier?
Nigel Fds

J'ai .NET v4.0.30319, v2.0.50727, v1.1.4322, v1.0.3705 installé via sur une machine virtuelle installée à partir d'ici: developer.microsoft.com/en-us/microsoft-edge/tools/vms , et cela fonctionne. donc je suppose que vous n'avez pas besoin de .NET 4.5
alpha_989

C'est la solution la plus pratique sur les systèmes modernes, cela écrira un zip de plus de 2 Go, tandis que le "Compress-Archive" standard de Powershell échouera.
Shukri Adams

135

Si Java est installé, vous pouvez compresser en une archive ZIP à l'aide de la jarcommande:

jar -cMf targetArchive.zip sourceDirectory

c = Crée un nouveau fichier d'archive.

M = Spécifie qu'un fichier manifeste ne doit pas être ajouté à l'archive.

f = Indique le nom du fichier cible.


3
génial, merci, juste ce que je cherchais ... Pour info - j'ai dû supprimer le caractère moins dans DOS ... par exemple jar cMf target.zip sourceDir
mlo55

3
Pas mal, mais vous avez besoin du JDK installé, pas du JRE.
pdem

2
Belle solution, probablement la plus indépendante de la plate-forme pour cela;)
Adrian

YMMD. idée géniale. m'a fait gagner beaucoup de temps.
gorefest

3
Est - ce couvert par « ... en utilisant uniquement Windows' intégré des capacités? » (c'est moi qui souligne)
Peter Mortensen

84

PowerShell 5.0

De Microsoft.PowerShell.Archivevous pouvez utiliser:

Par exemple:

  • Créez à result.zippartir de l'ensemble du Testdossier:

    Compress-Archive -Path C:\Test -DestinationPath C:\result
    
  • Extrayez le contenu de result.zipdans le Testdossier spécifié :

    Expand-Archive -Path result.zip -DestinationPath C:\Test
    

13
Cela fonctionne très bien, merci. Pour quiconque se retrouve ici, vous pouvez utiliser powershell Compress-Archive -Path C:\SomeFile.ext -DestinationPath C:\SomeFile.zipdirectement à partir de la ligne de commande sans avoir besoin de créer un script (en supposant que vous avez installé Powershell v5, ce que vous pouvez faire au moins pour revenir à Windows 7).
Beems

Fonctionne très bien, ajoutez l'option -Force si vous prévoyez de la relancer.
Robin Salih

1
@Beems, merci! Mais je pense que vous avez fâché le chemin / la destination dans l'autre sens?
Yiping

Cela fonctionne, mais l'archive est compressée différemment, que se passe-t-il si vous utilisez l'explorateur Windows "Envoyé vers -> dossier compressé (zippé)" La version PowerShell est plus grande et certains programmes ne peuvent pas être extraits
Eric Labashosky

Compress-Archive a une limite maximale de 2 Go sur le fichier d'entrée
Sergei Rodionov

37

Ce n'est pas exactement un ZIP, mais la seule façon de compresser un fichier à l'aide des outils Windows est:

makecab <source> <dest>.cab

Pour décompresser:

expand <source>.cab <dest>

Exemple avancé (de ss64.com):

Create a self extracting archive containing movie.mov:
C:\> makecab movie.mov "temp.cab"
C:\> copy /b "%windir%\system32\extrac32.exe"+"temp.cab" "movie.exe"
C:\> del /q /f "temp.cab"

Plus d'information: makecab , expand , utilisations avancées de makecab



34

Utilisation de 7-Zip:

Zip : vous avez un dossier fooet souhaitez le compressermyzip.zip

"C:\Program Files\7-Zip\7z.exe" a  -r myzip.zip -w foo -mem=AES256

Décompressez : vous voulez le décompresser ( myzip.zip) dans le répertoire courant ( ./)

"C:\Program Files\7-Zip\7z.exe" x  myzip.zip  -o./ -y -r

31
Veuillez noter la question:without the need to install any 3rd party
Roee Gavirel

16
@RoeeGavirel 7zip devrait être l'une des premières choses que vous installez sur n'importe quelle installation Windows: P
developerbmw

3
@developerbmw - A. pourquoi est-ce? B. Je gère environ 100 machines en production qui n'ont pas 7zip sur elles. Pour l'installer, il faudrait que les DevOps l'installent sur toutes ces machines et sur toutes les nouvelles machines qui seront ajoutées aux clusters. Je préfère l'éviter.
Roee Gavirel

1
@Roland: pourriez-vous s'il vous plaît être spatial; où ça va mal? Cela aidera tout le monde.
Monir

1
@Roland: Juste vérifié, la syntaxe fonctionne bien. Vous essayez probablement avec le dossier "foo" qui n'est pas présent sur votre machine. Mais devinez.
Monir

9

J'ai cherché à répondre à cette question exacte et d'après mes recherches, la réponse de DiryBoy semble être exacte.

J'ai trouvé que le programme compact.exe compresse les fichiers mais pas pour créer un fichier hautement compressé (ou un ensemble de fichiers). C'est similaire à l'option que vous obtenez lorsque vous cliquez avec le bouton droit sur une lettre de lecteur ou une partition dans Windows. Vous avez la possibilité de nettoyer (supprimer les fichiers temporaires, etc.) ainsi que de compresser les fichiers. Les fichiers compressés sont toujours accessibles mais sont simplement compressés pour créer de l'espace sur un lecteur qui manque d'espace.

J'ai également trouvé compress.exe que j'avais sur mon ordinateur. Il n'est pas natif sur la plupart des machines Windows et fait partie du kit de ressources 2003. Il crée un fichier zippé, mais il est vraiment plus similaire aux fichiers d'un disque d'installation de Windows (le trait de soulignement est le dernier caractère de l'extension ou du nom du fichier). Et la commande extract.exe extrait ces fichiers.

Cependant, le mantra est que si cela peut être fait en natif via l'interface graphique, il existe probablement un moyen de le faire via batch, .vbs ou tout autre type de script dans la ligne de commande. Depuis que Windows a eu l'option «envoyer vers» pour créer un fichier zip, je savais qu'il devait y avoir un moyen de le faire via la ligne de commande et j'ai trouvé quelques options.

Voici un excellent lien qui montre comment compresser un fichier à l'aide de commandes natives Windows.

/superuser/110991/can-you-zip-a-file-from-the-command-prompt-using-only-windows-built-in-capabili

Je l'ai testé avec un répertoire contenant plusieurs fichiers et dossiers imbriqués et cela a parfaitement fonctionné. Suivez simplement le format de la ligne de commande.

Il existe également un moyen de décompresser les fichiers via la ligne de commande que j'ai également trouvé. Dans un sens, ouvre simplement une fenêtre d'explorateur indiquant le contenu du fichier compressé. Certains d'entre eux utilisent également Java qui n'est pas nécessairement natif de Windows, mais est si commun qu'il semble presque l'être.

/superuser/149489/does-windows-7-have-unzip-at-the-command-line-installed-by-default

Comment décompresser un fichier en utilisant la ligne de commande?



8

Vous pouvez utiliser un script VBScript enveloppé dans un fichier BAT. Ce code fonctionne sur un CHEMIN relatif.

Il n'y a aucun besoin d'outils ou de dépendances tiers. Réglez juste SOURCEDIRet OUTPUTZIP.

Nom de fichier: ZipUp.bat

echo Set fso = CreateObject("Scripting.FileSystemObject") > _zipup.vbs
echo InputFolder = fso.GetAbsolutePathName(WScript.Arguments.Item(0)) >> _zipup.vbs
echo ZipFile = fso.GetAbsolutePathName(WScript.Arguments.Item(1)) >> _zipup.vbs

' Create empty ZIP file.
echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipup.vbs

echo Set objShell = CreateObject("Shell.Application") >> _zipup.vbs
echo Set source = objShell.NameSpace(InputFolder).Items >> _zipup.vbs
echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipup.vbs

echo ' Keep script waiting until compression is done
echo Do Until objShell.NameSpace( ZipFile ).Items.Count = objShell.NameSpace( InputFolder ).Items.Count >> _zipup.vbs
echo     WScript.Sleep 200 >> _zipup.vbs
echo Loop >> _zipup.vbs

CScript  _zipup.vbs  %SOURCEDIR%  %OUTPUTZIP%

del _zipup.vbs

Exemple d'utilisation

SET SOURCEDIR=C:\Some\Path
SET OUTPUTZIP=C:\Archive.zip
CALL ZipUp

Alternativement, vous pouvez paramétrer ce fichier en remplaçant la ligne CScript _zipup.vbs %SOURCEDIR% %OUTPUTZIP%par CScript _zipup.vbs %1 %2, auquel cas il peut être encore plus facilement appelé en appelant simplement CALL ZipUp C:\Source\Dir C:\Archive.zip.


La ligne qui crée le fichier zip initial doit être échappée sinon elle ne se retrouve pas dans le script.
coupe

Oui, c'est la voie à suivre (comme dans la question Super utilisateur ).
Peter Mortensen

J'ai ajouté une version correctement échappée comme réponse.
fsteff

5

J'ai un problème avec toutes ces solutions.

Ils ne sont pas exactement les mêmes, et ils créent tous des fichiers qui ont une légère différence de taille par rapport à ceux RMB --> send to --> compressed (zipped) foldercréés à partir du même dossier source. La différence de taille la plus proche que j'ai eue est de 300 Ko de différence (script> manuel), faite avec:

powershell Compress-Archive -Path C:\sourceFolder -CompressionLevel Fastest -DestinationPath C:\destinationArchive.zip

(Remarquez le -CompressionLevel . Il existe trois valeurs possibles : Fastest, NoCompression & Optimal, (par défaut: Optimal))

Je voulais créer un fichier .bat qui devrait automatiquement compresser un dossier de plugins WordPress sur lequel je travaille, dans une archive .zip, afin de pouvoir le télécharger sur le site WordPress et tester le plugin.

Mais pour une raison quelconque, cela ne fonctionne avec aucune de ces compressions automatiques, mais cela fonctionne avec la compression manuelle RMB, ce que je trouve vraiment étrange.

Et les fichiers .zip générés par script cassent en fait les plugins WordPress au point où ils ne peuvent pas être activés, et ils ne peuvent pas non plus être supprimés de WordPress. Je dois SSH dans le "côté arrière" du serveur et supprimer les fichiers plugin téléchargés eux-mêmes, manuellement. Alors que les fichiers générés manuellement par RMB fonctionnent normalement.


Qu'est-ce que "wbr" et "RMB" ?
Peter Mortensen

RMB = bouton droit de la souris. <wbr> = une balise HTML qui indique une "opportunité Word BReak" au navigateur (supprimée, car cela n'a pas fonctionné).
Sebastian Norr

4

Si vous devez le faire dans le cadre d'un script, la meilleure façon est d'utiliser Java. En supposant que le répertoire bin se trouve dans votre chemin (dans la plupart des cas), vous pouvez utiliser la ligne de commande:

jar xf test.zip

Si Java n'est pas sur votre chemin, référencez-le directement:

C:\Java\jdk1.6.0_03\bin>jar xf test.zip

3

L'open source est votre ami :-)

Voici la décompression : http://gnuwin32.sourceforge.net/packages/unzip.htm

Il existe également une commande ZIP: http://gnuwin32.sourceforge.net/packages/zip.htm

Le téléchargement des binaires est suffisant.


Sous Windows 8, il génère une erreur: bzip2.dll est manquant.
Doug

1
@Doug il dit que bzip2 est une exigence sur la page et a un lien à télécharger
Sam

11
La question initiale était de savoir comment utiliser les commandes Windows standard intégrées. De plus, il n'est pas souhaitable d'obliger vos utilisateurs à installer diverses solutions tierces, car votre propre outil ou solution est désormais limité aux utilisateurs qui ont des autorisations administratives sur leur ordinateur ou qui ne se soucient pas d'une collection croissante de petites dépendances sur leur système. . L'open source peut être votre ami, mais les packages open source qui nécessitent que vous installiez d'autres packages open source qui vous obligent à installer d'autres packages open source et ainsi de suite ne sont décidément pas votre ami.
Steve Hollasch

SourceForge est bloqué par la politique de pare-feu de mon travail :-(
SnookerC

1
Cela utilise toujours des logiciels tiers
Деян Добромиров

3

Ceci est une version mise à jour de la réponse fournie par @ PodTech.io

Cette version a tout le code vbs correctement échappé dans le fichier de commandes. Il est également créé dans une sous-routine, qui peut être appelée avec une seule ligne de n'importe où dans votre script de commandes:

:: === Main code:

call :ZipUp "C:\Some\Path" "C:\Archive.zip"


:: === SubRoutines:

:ZipUp
::Arguments: Source_folder, destination_zip
(
    echo:Set fso = CreateObject^("Scripting.FileSystemObject"^)
    echo:InputFolder = fso.GetAbsolutePathName^(WScript.Arguments.Item^(0^)^)
    echo:ZipFile = fso.GetAbsolutePathName^(WScript.Arguments.Item^(1^)^)
    echo:
    echo:' Create empty ZIP file.
    echo:CreateObject^("Scripting.FileSystemObject"^).CreateTextFile^(ZipFile, True^).Write "PK" ^& Chr^(5^) ^& Chr^(6^) ^& String^(18, vbNullChar^)
    echo:
    echo:Set objShell = CreateObject^("Shell.Application"^)
    echo:Set source = objShell.NameSpace^(InputFolder^).Items
    echo:objShell.NameSpace^(ZipFile^).CopyHere^(source^)
    echo:
    echo:' Keep script waiting until compression is done
    echo:Do Until objShell.NameSpace^( ZipFile ^).Items.Count = objShell.NameSpace^( InputFolder ^).Items.Count
    echo:    WScript.Sleep 200
    echo:Loop
)>_zipup.vbs
CScript //Nologo _zipup.vbs "%~1" "%~2"
del _zipup.vbs
goto :eof

2

Vous dites que vous essayez de le faire sans logiciel tiers. Je ne sais pas si vous envisageriez un logiciel "tiers" .NET.

Mais vous pouvez créer votre propre utilitaire de ligne de commande dans .NET. Il ne devrait pas nécessiter plus de quelques lignes de code.

Classe ZipFile


0

En ajoutant la réponse de @Jason Duffett et ses commentaires, voici un script qui obtient l'entrée et la sortie (nom de fichier et nom de répertoire, respectivement) de l'utilisateur:

@echo off
set input=%1
set output=%2
powershell.exe "Add-Type -A 'System.IO.Compression.FileSystem'; [IO.Compression.ZipFile]::ExtractToDirectory('%input%', '%output%');"

Usage:

unzip.bat path\to\file.zip path\to\output\directory

-4

Pour compresser un fichier:

C:\> zip -9 -m -o file.dat.zip file.dat
  • -9 compression maximale
  • -m supprimer le fichier d'origine après une compression réussie
  • -o définir la date de modification du fichier zip comme le fichier d'origine
  • dommage qu'il faut lui donner le nom du fichier zip souhaité au lieu d'ajouter simplement l'extension .zip au nom du fichier à compresser

4
deux choses: (1) "zip" n'est pas fourni avec Windows, c'est donc probablement un tiers que vous avez. et comme ma question l'a mentionné, je ne peux pas installer de tierces parties. (2) La raison pour laquelle vous devez fournir le nom souhaité est parce que la création et l'archivage des fichiers sont compressés (comme un dossier dans une séance) et que vous pouvez y avoir plus d'un fichier.
Roee Gavirel

@RoeeGavirel Sur le serveur, j'ai trouvé l'utilitaire de ligne de commande zip, il n'y a pas d'outil GUI winzip installé, j'ai donc deviné que l'outil CLI nu était livré avec Windows. D'un autre côté, les utilitaires de compression Unix / Linux comme compress, bzip2 et gzip créent un fichier compressé avec le même nom de fichier d'origine plus l'extension (.Z, .bz2 ou .gz), si vous ne passez pas le nom de fichier compressé.
Tulains Córdova

-4

Vous pouvez décompresser un fichier Windows compressé zippé ou natif en utilisant la commande Expand , par exemple

expand MyFile.zip myFile

9
J'ai essayé, mais il copie MyFile.zip dans le dossier myFile,
fhnaseer

Cela m'a aidé à C: \> développer /?
snow6oy

11
Expand ne fonctionne qu'avec le fichier .cab et n'est pas approprié pour les fichiers zip.
рüффп

2
Idem les autres commentaires ici. Expand file.zip filecopie simplement le zip dans un autre fichier sans l'extension. Il ne décompresse pas le ZIP dans un dossier.
Dave Marley
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.