使用CopyHere写入文件而不使用WScript.Sleep

mle*_*vit 5 vbscript sleep wsh

我编写了一个小的VBScript来创建.zip文件,然后将指定文件夹的内容复制到该.zip文件中.

我出于某种原因逐个复制文件(我知道我可以一次完成所有这些).但是我的问题是,当我尝试在没有WScript的情况下逐个复制它们.在每次循环迭代之间,我得到一个"找不到文件或没有读取权限".错误; 如果我WScript.Sleep 200在每次写入后放置它有效但不是100%的时间.

我想摆脱Sleep功能并不依赖于它,因为根据文件大小的不同,写入可能需要更长的时间,因此200毫秒可能还不够.

正如您可以看到下面的一小段代码,我遍历文件,然后如果它们与扩展名匹配,我将它们放入.zip(zipFile)

For Each file In folderToZip.Items
    For Each extension In fileExtensions
        if (InStr(file, extension)) Then
            zipFile.CopyHere(file)
            WScript.Sleep 200
            Exit For
        End If
    Next
Next
Run Code Online (Sandbox Code Playgroud)

关于如何停止依赖睡眠功能的任何建议?

谢谢

Tom*_*lak 0

您可以尝试访问刚刚复制的文件,例如使用“存在”检查:

For Each file In folderToZip.Items
    For Each extension In fileExtensions
        If LCase(oFSo.GetExtensionName(file)) = LCase(extension) Then
            zipFile.CopyHere(file)
            Dim i: i = 0
            Dim target: target = oFSO.BuildPath(zipFile, oFSO.GetFileName(file))
            While i < 100 And Not oFSO.FileExists(target) 
              i = i + 1
              WScript.Sleep 10
            Wend
            Exit For
        End If
    Next
Next
Run Code Online (Sandbox Code Playgroud)

我不确定target对于此使用上下文是否正确计算,但您明白了。我有点惊讶这个错误首先发生......FileSystemObject应该是严格同步的。

如果其他方法都失败,请执行以下操作:

For Each file In folderToZip.Items
    For Each extension In fileExtensions
        If LCase(oFSo.GetExtensionName(file)) = LCase(extension) Then
            CompressFailsafe zipFile, file
            Exit For
        End If
    Next
Next

Sub CompressFailsafe(zipFile, file)
  Dim i: i = 0
  Const MAX = 100

  On Error Resume Next
  While i < MAX
    zipFile.CopyHere(file)
    If Err.Number = 0 Then 
      i = MAX
    ElseIf Err.Number = xxx ''# use the actual error number!
      Err.Clear
      WScript.Sleep 100
      i = i + 1
    Else 
      ''# react to unexpected error
    End Of
  Wend
  On Error GoTo 0
End Sub
Run Code Online (Sandbox Code Playgroud)