Zamieszczę coś związanego z odpowiedzią WSkids ponieważ niestety nie mogę użyć funkcji komentarza.
Użycie metody CopyHere() w VBS wprowadza kilka kwestii. Jedną z nich jest to, że metoda ta wraca natychmiast, podczas gdy proces kopiowania rozpoczyna się w tle, podczas gdy wiele wywołań CopyHere() będzie zakłócać się nawzajem i ZIP nie zostanie utworzony poprawnie. Potrzebna jest tutaj pętla oczekiwania, aby to naprawić. Moja pętla oczekiwania jest oparta na odpowiedzi na podobny problem zamieszczonej tutaj .
Tutaj jest zaktualizowana wersja, która naprawia błąd “Object required” zgłoszony przez pihentagy . Jest to problem z czasem, ponieważ nowo utworzony plik ZIP jest dołączony do kolekcji Items, gdy skrypt jest wykonywany na szybkich maszynach.
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