Ich werde etwas im Zusammenhang mit WSkids antworten, da ich die Kommentarfunktion leider nicht verwenden kann.
Die Verwendung der CopyHere()-Methode in VBS führt zu verschiedenen Problemen. Eines dieser Probleme besteht darin, dass die Methode sofort zurückkehrt, während der Kopiervorgang im Hintergrund startet, während mehrere CopyHere()-Aufrufe sich gegenseitig stören und die ZIP-Datei nicht korrekt erstellt wird. Hier ist eine Warteschleife erforderlich, um dies zu beheben. Meine Warteschleife basiert auf einer Antwort auf ein ähnliches Problem, die hier .
Hier ist eine aktualisierte Version, die den von pihentagy gemeldeten Fehler “Objekt erforderlich” behebt. Es handelt sich um ein Zeitproblem, da die neu erstellte ZIP-Datei in die Items-Sammlung aufgenommen wird, wenn das Skript auf schnellen Maschinen ausgeführt wird.
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