2010-10-20 07:50:38 +0000 2010-10-20 07:50:38 +0000
63
63

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 dans la ligne de commande, je ne veux pas utiliser un exécutable tiers.

Je pensais à quelque chose comme “envoyer dans un dossier compressé” mais je ne sais pas comment faire…

Réponses (10)

41
41
41
2015-04-06 21:26:20 +0000

A 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

input.txt ici pourrait aussi être un répertoire https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.archive/compress-archive?view=powershell-5.1

7
7
7
2010-10-20 07:57:39 +0000

Je ne pense pas qu'il y ait une ligne de commande pour les fichiers ZIP intégrée à Windows (autre que compress dans le kit de ressources du serveur 2003). Il faudrait faire appel à un tiers. Tout le monde aime 7zip !

6
6
6
2010-10-20 08:32:39 +0000

J'ai combiné ce scénario provenant de plusieurs sources différentes pour mieux répondre à mes besoins. Copiez et collez le script dans un fichier avec l'extension “.vbs”. Le script a été conçu à l'origine pour Windows XP, mais il fonctionne également sous Windows 7 x64 Ultimate - aucune garantie que Windows conservera les différents objets Shell qu'il utilise. Utilisation : dans la fenêtre d'exécution ou en ligne de commande, mettez

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

Chemin du script, dossier source, fichier zip à créer (inclure .zip à la fin).

Il ne copiera pas les dossiers vides, alors faites attention.

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
4
4
4
2018-07-04 11:29:13 +0000

Imaginez que vous vouliez compresser le même dossier que vous êtes à l'invite de commande SANS ouvrir une fenêtre powerhell :

powershell Compress-Archive . publish.zip
2
2
2
2018-01-18 22:50:18 +0000

Voici une autre idée, provenant 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>
2
2
2
2016-11-30 12:19:08 +0000

Il est possible d'exécuter le script PowerShell à partir de BAT. Le fichier BAT reçoit le chemin d'accès au répertoire à zipper et le nom du fichier zip en paramètre.

@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
1
1
1
2013-11-15 04:21:10 +0000

Voici un excellent lien qui montre comment zipper un fichier en utilisant les commandes natives de Windows. Pouvez-vous zipper un fichier à partir de l'invite de commande en utilisant UNIQUEMENT la capacité intégrée de Windows de zipper des fichiers ?

Je l'ai testé avec un répertoire contenant plusieurs fichiers et dossiers imbriqués et cela a fonctionné parfaitement. 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 trouvé. L'un des moyens consiste à ouvrir une fenêtre d'exploration indiquant le contenu du fichier zippé. Certains utilisent également Java, qui n'est pas nécessairement natif de Windows mais qui est si courant qu'il semble presque l'être. Est-ce que Windows 7 a la fonction de décompression en ligne de commande installée par défaut ? https://stackoverflow.com/questions/1021557/how-to-unzip-a-file-using-the-command-line

1
1
1
2017-08-16 06:41:05 +0000

C'est 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 il est vraiment peu performant par rapport au produit open source 7zip que l'on trouve ici http://www.7- zip.org/

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

7Zip supporte un large éventail de fichiers, y compris ZIP, RAR, CAB et ISO et son propre format 7z.

Vous pouvez consulter l'aide en ligne de commande : “C:\Program Files\7-Zip\7z.exe” –help

pour effectuer un simple ajout à une archive zip :

“C:\Program Files\7-Zip\7z.exe” un nom de fichier .zip c:\path

1
1
1
2015-01-07 14:22:03 +0000

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

L'utilisation de la méthode CopyHere() dans VBS introduit plusieurs problèmes. L'un de ces problèmes est que la méthode retourne immédiatement alors que le processus de copie commence en arrière-plan, alors que plusieurs appels à CopyHere() interféreront les uns avec les autres 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 posté ici .

Voici une version mise à jour qui corrige l'erreur “Object required” signalée par pihentagy . Il s'agit d'un problème de timing car le fichier ZIP nouvellement créé est inclus dans la collection Items 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
1
1
1
2015-01-22 12:27:53 +0000

Voici ma tentative de résumer les capacités intégrées des fenêtres 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 données qui devraient fonctionner sur presque toutes les machines Windows.