148 votes

Créer un dossier .zip à partir de la ligne de commande - (Windows)

Est-il possible de créer un fichier .zip à partir d'un dossier en ligne de commande ? Je ne veux pas utiliser d'exécutable tiers.

Je pensais à quelque chose comme "envoyer dans un dossier compressé", mais je ne sais pas comment faire...

2voto

Zimba Points 753

Pour compresser un fichier à partir de CMD :

compact /c /exe lzx input.txt

(fonctionne sur les Volumes NTFS) La taille du fichier après compression est toujours la même en CLI dir ou GUI File Properties mais l'espace disque occupé est (6 à 8 fois) inférieur. Les fichiers compressés en binaire ne feront pas beaucoup de différence.

Pour le format de fichier ZIP de PKWare, le taux de compression est environ 4 fois plus élevé que compact (d'après les tests effectués sur Win 10) et intègre une gamme d'algorithmes de compression tels que Deflate, BZip, LZW, LZMA, LZ77, PPMd, etc.

Ces technologies sont plus récentes que l'époque du DOS et du CMD, mais on peut toujours y accéder via des outils CLI plus récents comme Powershell, JScript, VBScript, etc.

Pour powershell à partir de Win CMD :

powershell "Compress-Archive input.txt output.zip"

o tar dans Windows 10 :

Usage:
  List:    tar -tf <archive-filename>
  Extract: tar -xf <archive-filename>
  Create:  tar -cf <archive-filename> [filenames...]
  Help:    tar --help

1voto

BMB Points 2024

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

Pouvez-vous compresser un fichier à partir de l'invite de commande en utilisant UNIQUEMENT la fonction intégrée de Windows pour compresser des fichiers ?

Je l'ai testé avec un répertoire contenant plusieurs fichiers et dossiers imbriqués et cela a parfaitement fonctionné. Il suffit de suivre 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é. Une façon de faire est d'ouvrir une fenêtre d'exploration montrant le contenu du fichier zippé. Certains d'entre eux utilisent également Java qui n'est pas nécessairement natif de Windows mais qui est si commun qu'il en a l'air.

Est-ce que Windows 7 a unzip à la ligne de commande installé par défaut ?

https://stackoverflow.com/questions/1021557/how-to-unzip-a-file-using-the-command-line

1voto

ViRuSTriNiTy Points 119

Je vais poster quelque chose en rapport avec WSkids réponse car malheureusement je ne peux pas utiliser la fonction commentaire.

L'utilisation de la méthode CopyHere() en VBS pose plusieurs problèmes. L'un de ces problèmes est que la méthode retourne immédiatement alors que le processus de copie démarre en arrière-plan alors que de multiples appels à CopyHere() vont interférer entre eux et le ZIP ne sera pas créé correctement. Une boucle d'attente est nécessaire ici pour résoudre ce problème. Ma boucle d'attente est basée sur une réponse à une question similaire postée aquí .

Voici une version mise à jour qui corrige l'erreur "Object required" signalée par les utilisateurs du site. pihentagy . C'est un problème de timing car le fichier ZIP nouvellement créé est inclus dans la collection d'éléments lorsque le script est exécuté sur les machines rapides.

set Args = WScript.Arguments
source = Args(0)
' remove trailing slashes as we add slashes when needed later
while Right(source, 1) = "\"
    source = Mid(source, 1, Len(source) - 1)
wend

target = Args(1)

' create empty ZIP file
set fso = CreateObject("Scripting.FileSystemObject")
set zip = fso.OpenTextFile(target, 2, vbtrue)
' write ZIP header, this ensures that Windows recognizes the file as "ZIP Folder"
zip.Write "PK" & Chr(5) & Chr(6) & String(18, Chr(0))
zip.Close
set zip = nothing
set fso = nothing

' copy files to ZIP file
set app = CreateObject("Shell.Application")

set sourceFolderObj = app.NameSpace(source)
set targetFolderObj = app.NameSpace(target)

for each item in sourceFolderObj.Items
  itemPath = source & "\" & item.Name

  copyItem = false

  ' ZIP file is included in Items collection and is recognized as folder, thus skip it to avoid script errors
  if itemPath <> target then
    if item.IsFolder then
      if item.GetFolder.Items().Count = 0 then
        ' folder is empty, skip it as empty folders can't be compressed
      else
        copyItem = true
      end if
    else
      copyItem = true
    end if
  end if

  if copyItem then
    targetFolderObj.CopyHere item

    ' wait until the file appears in the ZIP file, 
    ' this is needed because CopyHere() returns immediately after starting an asynchronous copy process 
    ' (starting multiple asynchronous copy will not work as it causes error messages, an invalid ZIP file, ...)
    while (targetFolderObj.ParseName(item.Name) is nothing)
      WScript.Sleep 1
    wend
  end If
next

set targetFolderObj = nothing
set sourceFolderObj = nothing
set app = nothing

1voto

emma Points 1

Il s'agit d'une vieille question, mais sa pertinence est toujours d'actualité.

Windows a bien sûr son propre algorithme de compression intégré pour l'utilisation des fichiers zip, mais ses performances sont médiocres par rapport au produit open source 7zip que vous trouverez ici. http://www.7-zip.org/

D'autres ont déjà discuté de différentes méthodes pour utiliser les fonctions intégrées de Windows, ma solution nécessite l'installation d'un logiciel supplémentaire.

7Zip prend en charge un large éventail de fichiers, notamment les formats ZIP, RAR, CAB et ISO, ainsi que son propre format 7z.

Vous pouvez consulter l'aide en ligne de commande : " C:\Program Fichiers \7 -Zip \7z.exe " --help

pour effectuer un simple ajout à une archive zip :

" C:\Program Fichiers \7 -Zip \7z.exe " a filename.zip c : \path

1voto

eyeH8bingDotCom Points 19

Voici une autre idée, tirée de 4 sources différentes ; ce ne sont pas mes idées, mais je les ai compilées pour que cela fonctionne pour moi.

<!-- : Begin batch script
@each off

set sourceFolder="c:\test"
set destZip="%userprofile%\desktop\example.zip"

cscript //nologo "%~f0?.wsf" //job:exewsh %sourceFolder% %destZip%

exit /b
GOTO:EOF
----- Begin wsf script --->
<package><job id="exewsh"><script language="VBScript">
'Get command-line arguments.
Set objArgs = WScript.Arguments
InputFolder = objArgs(0)
ZipFile = objArgs(1)

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

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

'Required!
wScript.Sleep 2000
</script></job>
</package>

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