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