Créez le dossier .zip à partir de la ligne de commande – (Windows)

Est-il possible de créer un fichier .zip à partir d'un dossier dans la ligne de commande, je ne veux pas utiliser d'exécutable tiers.

Je pensais quelque chose comme «envoyer au dossier compressé» mais je ne sais pas comment le faire …

À partir de PowerShell 5 (février 2016), vous pouvez utiliser "Compress-Archive":

 Compress-Archive -Path input.txt -DestinationPath output.zip 

Ou:

 Compress-Archive input.txt output.zip 

http://msdn.microsoft.com/powershell/reference/5.0/microsoft.powershell.archive/compress-archive

Je ne pense pas qu'il existe une ligne de commande pour les fichiers ZIP intégrés à Windows (autre que compress dans le Kit de ressources Server 2003). Vous devriez utiliser un tiers. Tout le monde aime 7zip !

J'ai combiné ce script de différentes sources pour mieux répondre à mes besoins. Copiez et collez le script dans un fichier avec l'extension ".vbs". Le script a été créé à l'origine pour Windows XP, mais il fonctionne également dans Windows 7 x64 Ultimate – aucune garantie si Windows va conserver les différents objets Shell utilisés.

Utilisation: dans la case à cocher ou dans la ligne de commande,

 "C:\zipper.vbs" "C:\folderToZip\" "C:\mynewzip.zip" 

Chemin d'accès au script, dossier source, fichier zip à créer (inclure .zip à la fin).

Il ne copiera pas de dossiers vides, alors soyez prudent.

Voici le code vbs —

 Set Args = Wscript.Arguments source = Args(0) target = Args(1) ' make sure source folder has \ at end If Right(source, 1) <> "\" Then source = source & "\" End If Set objFSO = CreateObject("Scripting.FileSystemObject") Set zip = objFSO.OpenTextFile(target, 2, vbtrue) ' this is the header to designate a file as a zip zip.Write "PK" & Chr(5) & Chr(6) & String( 18, Chr(0) ) zip.Close Set zip = nothing wscript.sleep 500 Set objApp = CreateObject( "Shell.Application" ) intSkipped = 0 ' Loop over items within folder and use CopyHere to put them into the zip folder For Each objItem in objApp.NameSpace( source ).Items If objItem.IsFolder Then Set objFolder = objFSO.GetFolder( objItem.Path ) ' if this folder is empty, then skip it as it can't compress empty folders If objFolder.Files.Count + objFolder.SubFolders.Count = 0 Then intSkipped = intSkipped + 1 Else objApp.NameSpace( target ).CopyHere objItem End If Else objApp.NameSpace( target ).CopyHere objItem End If Next intSrcItems = objApp.NameSpace( source ).Items.Count wscript.sleep 250 ' delay until at least items at the top level are available Do Until objApp.NameSpace( target ).Items.Count + intSkipped = intSrcItems wscript.sleep 200 Loop 'cleanup Set objItem = nothing Set objFolder = nothing Set objApp = nothing Set objFSO = nothing 

Voici un excellent lien qui montre comment faire glisser un fichier en utilisant les commandes natives de Windows.

Pouvez-vous glisser un fichier à partir de l'invite de commande en utilisant uniquement la fonction intégrée de Windows pour les fichiers zip?

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 trouvé aussi. Dans un sens, il suffit d'ouvrir une fenêtre d'exploration montrant quel est le contenu du fichier zippé. Certains d'entre eux utilisent également Java qui n'est pas nécessairement originaire de Windows, mais il est tellement courant qu'il le semble presque.

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

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

Je publierai quelque chose lié à la réponse de WSkids car, malheureusement, je ne peux pas utiliser la fonction de commentaire.

L'utilisation de la méthode CopyHere () dans VBS présente plusieurs problèmes. L'une de ces questions est que la méthode revient immédiatement alors que le processus de copie commence en arrière-plan alors que plusieurs appels CopyHere () s'interfèrent et le ZIP ne sera pas créé correctement. Une boucle d'attente est nécessaire pour résoudre ce problème. Ma boucle d'attente est basée sur une réponse à un problème similaire publié ici .

Voici une version mise à jour qui corrige l'erreur «Objet requis» signalée par pihentagy . C'est un problème de synchronisation car le fichier ZIP nouvellement créé est inclus dans la collection Objets lorsque le script est exécuté sur des 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 

Voici ma tentative de résumer les fonctionnalités intégrées Windows pour la compression et la décompression – https://stackoverflow.com/questions/28043589/how-can-i-compres-zip-and-uncopress-unzip-files-and-folders -with-batch-f

Avec quelques solutions qui devraient fonctionner sur presque toutes les machines Windows.

Il est possible d'exécuter le script PowerShell à partir de MTD. Le chemin de réception de fichier Bat est indiqué dans le répertoire pour être zippé et le nom du fichier zip comme paramètres.

 @echo off setlocal rem First parameter - path to dir to be zipped rem Second parameter- zip file name set sourceDir=%1 set zipFile=%2 rem Create PowerShell script echo Write-Output 'Custom PowerShell profile in effect!' > %~dp0TempZipScript.ps1 echo Add-Type -A System.IO.Compression.FileSystem >> %~dp0TempZipScript.ps1 echo [IO.Compression.ZipFile]::CreateFromDirectory('%sourceDir%','%~dp0%zipFile%') >> %~dp0TempZipScript.ps1 rem Execute script with flag "-ExecutionPolicy Bypass" to get around ExecutionPolicy PowerShell.exe -ExecutionPolicy Bypass -Command "& '%~dp0TempZipScript.ps1'" del %~dp0TempZipScript.ps1 endlocal 

C'est une question ancienne, mais sa pertinence est encore actuelle.

Windows, bien sûr, a son propre algorithme de compression intégré à l'utilisation de fichiers zip, mais il fonctionne vraiment mal par rapport au produit open source 7zip trouvé ici http://www.7-zip.org/

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

7Zip prend en charge une large gamme de fichiers, y compris ZIP, RAR, CAB et ISO et son propre format 7z.

Vous pouvez afficher l'aide de la ligne de commande: "C: \ Program Files \ 7-Zip \ 7z.exe" –help

Pour effectuer une simple addition à l'archive zip:

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