Ответ 1
Ваш код немного сложнее, чем нужно, но он работает в принципе. Причиной сбоев, которые вы испытываете с большими папками, является фиксированная 2-секундная задержка в конце:
WScript.Sleep 2000
CopyHere
выполняется асинхронно, что означает, что он работает в фоновом режиме, а script продолжается. Однако после 2 секунд задержки script завершается (и экземпляр Shell.Application
с ним), закончил ли CopyHere
или нет. Когда у вас много/больших файлов, обработка может занять более 2 секунд.
Вот почему ваш script отлично работает для небольших папок, но не для больших. Копирование просто не завершено, когда script завершается через 2 секунды.
Чтобы этого избежать, замените фиксированную задержку на проверку, которая сравнивает количество обработанных файлов с общим количеством файлов:
Set fso = CreateObject("Scripting.FileSystemObject")
Set app = CreateObject("Shell.Application")
zipfile = "C:\Temp\logs_" & Day(Date) & Month(Date) & Year(Date) & ".zip"
fldr = "C:\Temp\sample"
cnt = fso.GetFolder(fldr).Files.Count
'create a new empty zip file
fso.OpenTextFile(zipfile, 2, True).Write "PK" & Chr(5) & Chr(6) _
& String(18, Chr(0))
'start copying the files from the source folder to the zip file
Set zip = app.NameSpace(zipfile)
zip.CopyHere app.NameSpace(fldr).Items '<- runs asynchronously!
'wait for CopyHere to finish
Do
WScript.Sleep 100
Loop Until zip.Items.Count = cnt