压缩大文件夹失败

use*_*072 0 vbscript

我试图归档日志以捕获间歇性故障,在该间歇性故障中,我的日志被定期覆盖。我希望将日志存档,以确保捕获所需的事件。

我已经写了执行该功能的函数代码,但是,如果文件夹很大,则zip失败。如果我将其指向一个较小的目录,它将正常工作。不会产生任何错误,对于确定原因,我们将不胜感激。

由于我以前从未在VBS中进行编程,因此如果这是一个简单的问题,我会提前道歉。

Option Explicit 
dim objFSO, objFolder, FolderToZip, ziptoFile 
dim ShellApp, eFile, oNewZip, strZipHeader 
dim ZipName, Folder, i, Zip 
Set objFSO = CreateObject("Scripting.FileSystemObject") 
Set objFolder = objFSO.GetFolder("D:\Program Files\afolder") 


Wscript.Sleep 2000 
Set oNewZip = objFSO.OpenTextFile("C:\Archive\logs_" & day(date) & month(Date) & Year(date)& ".zip", 8, True) 
strZipHeader = "PK" & Chr(5) & Chr(6) 
For i = 0 to 17 
 strZipHeader = strZipHeader & Chr(0) 
Next 
oNewZip.Write strZipHeader 
oNewZip.Close 
Set oNewZip = Nothing 
WScript.Sleep 5000 

FolderToZip = "D:\Program Files\afolder" 
ZipToFile = "C:\Archive\logs_" & day(date) & month(Date) & Year(date)& ".zip"
Set ShellApp = CreateObject("Shell.Application") 
Set Zip= ShellApp.NameSpace(ZipToFile) 
Set Folder= ShellApp.NameSpace(FolderToZip) 
Zip.CopyHere(FolderToZip) 
WScript.Sleep 2000 
Run Code Online (Sandbox Code Playgroud)

Ans*_*ers 5

您的代码比需要的要复杂一些,但是原则上可以工作。导致您在使用大文件夹时遇到故障的原因是,固定的2秒延迟是在最后固定的:

WScript.Sleep 2000
Run Code Online (Sandbox Code Playgroud)

CopyHere异步运行,这意味着它在脚本继续运行时在后台运行。但是,延迟2秒后,脚本将终止(以及Shell.Application带有该实例的实例),无论该脚本是否CopyHere完成。当您有大量文件时,处理时间可能会超过2秒。

这就是为什么您的脚本适用于小型文件夹,但不适用于大型文件夹的原因。当脚本在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
Run Code Online (Sandbox Code Playgroud)