Je cherchais un moyen de créer un fichier zip sous Windows sans passer par un programme tiers (java, exe, python, ...).
Je pensais y arriver uniquement en batch mais en fait il faut faire quelques lignes de VB Script.
Le fichier batch :
@echo off REM ----- Setup ----- set SRC_DIR=C:\Temp\FolderToZip\ set VBS_FILE=.\zipIt.vbs set ARCHIVE_FOLDER=c:\Temp\ mkdir %ARCHIVE_FOLDER% 2> nul set DATE_TIME=%DATE:~-4%.%DATE:~3,2%.%DATE:~0,2%-%TIME:~0,2%.%TIME:~3,2%.%TIME:~6,2% set ZIP_FILE="%ARCHIVE_FOLDER%folderZipped_%DATE_TIME%.zip" REM ------ end ------- REM ----- Execute VBS file (creating ZIP file) ----- CScript %VBS_FILE% %SRC_DIR% %ZIP_FILE%
Le fichier VBS : zipIt.vbs
REM Récupération des arguments Set args = WScript.Arguments srcFolder = args(0) REM Dossier source, à zipper zipFilePath = args(1) REM Chemin du fichier zip à créer REM Récupération des chemins absolus set fso = CreateObject("Scripting.FileSystemObject") srcFolder = fso.GetAbsolutePathName(srcFolder) zipFilePath = fso.GetAbsolutePathName(zipFilePath) REM Magie noire... REM Création du fichier zip (vide) CreateObject("Scripting.FileSystemObject").CreateTextFile(zipFilePath, True).Write "PK" & Chr(5) & Chr(6) & String(18, vbNullChar) Set objShell = CreateObject("Shell.Application") Set zip = objShell.NameSpace(zipFilePath) Set source = objShell.NameSpace(srcFolder) REM REMplissage du fichier zip REM Malheureusement cette opération est non-bloquante zip.CopyHere source.Items REM il faut donc attendre jusqu'à qu'elle soit terminée. REM Pour cela on boucle tant que le nombre de fichiers dans le zip n'est pas égal au nombre de fichiers dans le dossier source. REM http://stackoverflow.com/questions/149956/how-to-determine-when-copy-finishes-in-vbscript Do Until zip.Items.Count = source.Items.Count WScript.Sleep 100 WScript.Echo "Copie en cours : " & zip.Items.Count & "/" & source.Items.Count Loop
Pour une raison que j'ignore le script échoue si la source contient, quelque part dans sa hiérarchie, un dossier vide.
J'obtiens le message suivant :
Windows was unable to add one or more empty directories to the Compressed (zipped) Folder.
Si quelqu'un peut m'expliquer pourquoi ou comment y remédier, ça serait sympa.
Si vous voulez un seul fichier qui fasse tout ça il est possible de créer le fichier VBS à la volée, l'exécuter puis le détruire :
@echo off REM ----- Setup ----- set SRC_DIR=C:\Temp\FolderToZip\ set VBS_FILE=.\zipIt.vbs set ARCHIVE_FOLDER=c:\Temp\ mkdir %ARCHIVE_FOLDER% 2> nul set DATE_TIME=%DATE:~-4%.%DATE:~3,2%.%DATE:~0,2%-%TIME:~0,2%.%TIME:~3,2%.%TIME:~6,2% set ZIP_FILE="%ARCHIVE_FOLDER%folderZipped_%DATE_TIME%.zip" REM ------ end ------- REM ------ Création du fichier VBS à chaud ----- REM Récupération des arguments echo Set args = WScript.Arguments>%VBS_FILE% echo srcFolder = args(0)>>%VBS_FILE% REM Dossier source, à zipper echo zipFilePath = args(1)>>%VBS_FILE% REM Chemin du fichier zip à créer REM Récupération des chemins absolus echo set fso = CreateObject("Scripting.FileSystemObject")>>%VBS_FILE% echo srcFolder = fso.GetAbsolutePathName(srcFolder)>>%VBS_FILE% echo zipFilePath = fso.GetAbsolutePathName(zipFilePath)>>%VBS_FILE% REM Magie noire... REM Création du fichier zip (vide) echo CreateObject("Scripting.FileSystemObject").CreateTextFile(zipFilePath, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar)>>%VBS_FILE% echo Set objShell = CreateObject("Shell.Application")>>%VBS_FILE% echo Set zip = objShell.NameSpace(zipFilePath)>>%VBS_FILE% echo Set source = objShell.NameSpace(srcFolder)>>%VBS_FILE% REM REMplissage du fichier zip REM Malheureusement cette opération est non-bloquante echo zip.CopyHere source.Items>>%VBS_FILE% REM il faut donc attendre jusqu'à qu'elle soit terminée. REM Pour cela on boucle tant que le nombre de fichiers dans le zip n'est pas égal au nombre de fichiers dans le dossier source. REM http://stackoverflow.com/questions/149956/how-to-determine-when-copy-finishes-in-vbscript echo Do Until zip.Items.Count = source.Items.Count>>%VBS_FILE% echo WScript.Sleep 100>>%VBS_FILE% echo WScript.Echo "Copie en cours : " ^& zip.Items.Count ^& "/" ^& source.Items.Count>>%VBS_FILE% echo Loop>>%VBS_FILE% REM ------ end ------- REM ----- Execute VBS file (creating ZIP file) ----- CScript %VBS_FILE% %SRC_DIR% %ZIP_FILE% REM ----- Suppression du fichier VBS ------ del %VBS_FILE%
Notez le caractère d'échappement "^" utilisé pour échapper les "&" à écrire dans le fichier.
Source
Création du zip : http://superuser.com/questions/110991/can-you-zip-a-file-from-the-command-prompt-using-only-windows-built-in-capabili
Attendre que la création du zip se termine : http://stackoverflow.com/questions/149956/how-to-determine-when-copy-finishes-in-vbscript