131 votes

Pouvez-vous compresser un fichier depuis l'invite de commandes en utilisant UNIQUEMENT la capacité intégrée de Windows à compresser des fichiers?

J'ai un fichier batch qui génère un fichier texte. Je pensais que ce serait bien si je pouvais aussi le compresser.

Ceci sera utilisé dans un environnement non contrôlé, donc je ne peux pas faire d'hypothèses sur la présence de produits logiciels tiers tels que 7-Zip, etc. Il est nécessaire d'utiliser la capacité de compression de fichiers intégrée à Windows.

1 votes

Pouvez-vous utiliser PowerShell ou un script WSH ? Cela pourrait être le seul moyen d'utiliser la gestion intégrée des fichiers zip de Windows en ligne de commande. Sinon, comme l'a souligné Molly, vous aurez besoin d'un outil tiers.

2 votes

Ainsi, vous envoyez à quelqu'un un fichier batch et vous ne pouvez pas lui envoyer un petit fichier gzip.exe statiquement lié ?

0 votes

La question de l'OP est excellente (accusation étrange de @quackquixote mise à part). Puisque Windows fournit cela en un seul clic sous SendTo, il devrait y avoir une commande utilisable dans un fichier BAT. C'est donc une bonne question même si la réponse est non et qu'il faut (ridiculement) recourir à l'utilisation d'un outil tiers qui peut être équivalent ou non.

6voto

matdumsa Points 6779

Si vous êtes capable d'installer les Outils de Kit de ressources, vous trouverez un outil en ligne de commande appelé COMPRESS qui peut créer des fichiers d'archive compressés comme zip.

Utilitaire de compression de fichiers Microsoft (R)  Version 5.00.2134.1
Copyright (C) Microsoft Corp. 1990-1999.  Tous droits réservés.

Compresse un ou plusieurs fichiers.

COMPRESS [-r] [-d] [-z] Source Destination
COMPRESS -r [-d] [-z] Source [Destination]

  -r            Renommer les fichiers compressés.
  -d            Mettre à jour uniquement les fichiers compressés s'ils sont obsolètes.
  -zx           Compression LZX.
  -z            Compression MS-ZIP.
  -zq[n]        Compression Quantum et niveau optionnel
                (dans la plage 1-7, par défaut c'est 4).
  Source        Spécification du fichier source. Les jokers peuvent être utilisés.
  Destination   Spécification du fichier | chemin de destination.
                La destination peut être un répertoire.
                Si la source est composée de plusieurs fichiers et que -r n'est pas spécifié,
                la destination doit être un répertoire.

4 votes

+1 Ne résout pas vraiment les choses, mais c'est toujours bon de le savoir.

5voto

cowlinator Points 525

Il existe une seule commande cmd.exe simple pour cela (via PowerShell v5.0+).

Pour zipper :

powershell Compress-Archive -LiteralPath 'C:\mypath\testfile.txt' -DestinationPath "C:\mypath\Test.zip"

Pour dézipper :

powershell Expand-Archive -LiteralPath "C:\mypath\Test.Zip" -DestinationPath "C:\mypath" -Force

Sources :

Un grand merci à @Ramhound.

0 votes

Veuillez ne pas poster la même réponse à plusieurs questions. Si les mêmes informations répondent vraiment aux deux questions, alors une question (généralement la plus récente) doit être fermée comme un doublon de l'autre. Vous pouvez indiquer cela en votant pour le fermer comme un doublon ou, si vous n'avez pas assez de réputation pour cela, élever un drapeau pour indiquer que c'est un doublon. Sinon, adaptez votre réponse à cette question et ne faites pas que coller la même réponse à plusieurs endroits.

0 votes

Qui est "@Ramhound"? Pouvez-vous fournir un lien ?

0 votes

Ils sont un utilisateur de Stack Exchange, quelque part. Je n'ai pas de lien.

4voto

Hashbrown Points 2148

Si vous utilisez Windows 8 ou Windows Server 2012, vous aurez PowerShell et .NET 4.5, vous pouvez donc faire ceci:

zip.ps1 (utilisation : -directory -name ):

param (
    [string]$directory,
    [string]$name
)

Add-Type -Assembly System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::CreateFromDirectory($directory, $name, [System.IO.Compression.CompressionLevel]::Optimal, $false)

zip.bat (si vous avez besoin d'un assistant pour appeler PowerShell pour vous, le répertoire est le premier argument et le nom du ZIP le deuxième):

@Echo Off
powershell -ExecutionPolicy ByPass -Command "& '%~dpn0.ps1' -directory '%1' -name '%2'"

3voto

Jiří Kočara Points 39
'Continuez à attendre que la compression soit terminée
Tant que objShell.NameSpace( ZipFile ).Items.Count <> objShell.NameSpace( InputFolder ).Items.Count
    WScript.Sleep 200
Wend

0 votes

Exactement ce que je cherchais .. mais cela me donne une erreur "fichier Zip vide ou manquant"

0 votes

Pour une raison quelconque, cela n'incrément jamais, si j'imprime objShell.NameSpace( ZipFile ).Items.Count à l'intérieur de la boucle, c'est toujours 0 même si le fichier zip est créé et contient les éléments attendus à l'intérieur...

2voto

Fichiers / répertoires multiples avec du code simplifié.

cscript zip.vbs target.zip sourceFile1 sourceDir2 ... sourceObjN

fichier zip.vbs

Set objArgs = WScript.Arguments
ZipFile = objArgs(0)

' Créer un fichier ZIP vide et l'ouvrir pour y ajouter des fichiers
CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar)
Set zip = CreateObject("Shell.Application").NameSpace(ZipFile)

' Ajouter tous les fichiers/répertoires au fichier .zip
For i = 1 To objArgs.count-1
  zip.CopyHere(objArgs(i))
  WScript.Sleep 10000 'REQUIS !! (selon la taille du fichier/répertoire)
Next

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X