Ik zal iets plaatsen met betrekking tot WSkids antwoord omdat ik helaas de commentaar functie niet kan gebruiken.
Met de CopyHere() methode in VBS introduceert u een aantal zaken. Een van deze problemen is dat de methode onmiddellijk terugkeert terwijl het kopieerproces op de achtergrond begint, terwijl meerdere CopyHere() calls elkaar zullen storen en de ZIP niet correct zal worden aangemaakt. Een wachtlus is hier nodig om dat op te lossen. Mijn wachtlus is gebaseerd op een antwoord op een soortgelijk probleem dat is gepost hier .
Hier is een bijgewerkte versie die de door pihentagy gerapporteerde fout “Object required” herstelt. Het is een timingprobleem omdat het nieuw aangemaakte ZIP-bestand wordt opgenomen in de Items-collectie wanneer het script wordt uitgevoerd op snelle machines.
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