328 votes

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

Sur Windows, vous pouvez compresser certains fichiers en

cliquant droit → Envoyer versDossier compressé (zippé)

Et décompresser en double-cliquant sur le fichier .zip et extraire les fichiers.

Existe-t-il un moyen d'appliquer ces fonctionnalités depuis un script (.bat) sans avoir besoin d'installer un logiciel tiers?

4voto

Sebastian Norr Points 709

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 au RMB --> envoyer à --> dossier compressé (zippé) lorsqu'ils sont créés à partir du même dossier source. La différence de taille la plus proche que j'ai eue est de 300 Ko (script > manuel), réalisée 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 compresser automatiquement un dossier de plugin 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 pas 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 le script cassent en réalité les plugins WordPress au point de ne pas pouvoir être activés, et ils ne peuvent pas non plus être supprimés de l'intérieur de WordPress. Je dois me connecter en SSH à l'"arrière" du serveur et supprimer les fichiers de plugin téléchargés eux-mêmes, manuellement. Alors que les fichiers générés manuellement par RMB fonctionnent normalement.

3voto

fsteff Points 84

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 batch. Il est également créé en tant que sous-routine, qui peut être appelée avec une seule ligne de n'importe où dans votre script batch:

:: === Code principal:

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

:: === Sous-routines:

:ZipUp
::Arguments: Dossier_source, 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:' Créer un fichier ZIP vide.
    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:' Garder le script en attente jusqu'à ce que la compression soit terminée
    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

3voto

npocmaka Points 7794

Shell.Application

Avec Shell.Application, vous pouvez émuler la façon dont explorer.exe compresse les fichiers et dossiers. Le script s'appelle zipjs.bat:

:: décompresser le contenu d'un zip vers un dossier donné. Le contenu du zip ne sera pas conservé (-keep no). La destination ne sera pas écrasée (-force no)
call zipjs.bat unzip -source C:\myDir\myZip.zip -destination C:\MyDir -keep no -force no

:: lister le contenu d'un fichier zip et les chemins complets seront affichés (-flat yes)
call zipjs.bat list -source C:\myZip.zip\inZipDir -flat yes

:: lister le contenu d'un fichier zip et le contenu sera listé sous forme d'arborescence (-flat no)
call zipjs.bat list -source C:\myZip.zip -flat no

:: afficher la taille non compressée en octets
zipjs.bat getSize -source C:\myZip.zip

:: compresser le contenu du dossier sans le dossier lui-même
call zipjs.bat zipDirItems -source C:\myDir\ -destination C:\MyZip.zip -keep yes -force no

:: compresser un fichier ou un dossier (avec le dossier lui-même)
call zipjs.bat zipItem -source C:\myDir\myFile.txt -destination C:\MyZip.zip -keep yes -force no

:: décompresser uniquement une partie du zip avec le chemin donné à l'intérieur
call zipjs.bat unZipItem -source C:\myDir\myZip.zip\InzipDir\InzipFile -destination C:\OtherDir -keep no -force yes
call zipjs.bat unZipItem -source C:\myDir\myZip.zip\InzipDir -destination C:\OtherDir 

:: ajouter du contenu à un fichier zip
call zipjs.bat addToZip -source C:\some_file -destination C:\myDir\myZip.zip\InzipDir -keep no
call zipjs.bat addToZip -source  C:\some_file -destination C:\myDir\myZip.zip

MAKECAB

Makecab est l'outil de compression par défaut livré avec Windows. Bien qu'il puisse utiliser différents algorithmes de compression (y compris le format zip), le format de fichier est toujours un fichier .cab. Avec quelques extensions, il peut également être utilisé sur des machines Linux.

Compression d'un fichier:

makecab file.txt "file.cab"

Compresser un dossier entier nécessite un peu plus de travail. Voici comment un répertoire est compressé avec cabDir.bat:

call cabDir.bat ./myDir compressedDir.cab

La décompression est assez simple avec la commande expand:

EXPAND cabfile -F:* .

Une manière plus "hacky" est de créer un exécutable auto-extractible avec la commande extrac32:

copy /b "%windir%\system32\extrac32.exe"+"mycab.cab" "expandable.exe"
call expandable.exe

TAR

Avec la version 17063 de Windows, nous avons la commande tar:

:: compresser un répertoire
tar -cvf archive.tar c:\my_dir
:: extrait dans un répertoire
tar -xvf archive.tar.gz -C c:\data

Outils .NET

.Net (et Powershell) offrent de nombreuses façons de compresser et de décompresser des fichiers. La méthode la plus directe est avec le flux gzip. Le script s'appelle gzipjs.bat:

:: compresser
call gzipjs.bat -c my.file my.zip
:: décompresser
call gzipjs.bat -u my.zip my.file

3voto

Yochai Timmer Points 19802

Les nouvelles versions de Windows incluent tar.exe.
tar.exe peut être utilisé dans l'invite de commande ou les fichiers batch Windows.

//Compresser un dossier:
tar -caf aa.zip c:\aa

2voto

Lance Points 45

Vous pouvez décompresser un fichier Windows compressé au format ZIP ou natif en utilisant la commande Expand, par exemple.

expand MyFile.zip myFile

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