【问题标题】:How to set delay dynamically in VBScript如何在 VBScript 中动态设置延迟
【发布时间】:2013-05-06 17:41:17
【问题描述】:

我有一个批处理脚本,它将命令写入 .vbs 文件并在最后执行。 VBScript 的任务是压缩文件并删除原始文件。代码如下:

FOR %%c in (%1%filename*.*) DO ( 
REM zip file which is not of current date
ECHO "%%c"|FINDSTR "%CurrentDate%" >nul
IF ERRORLEVEL 1 (
echo Option Explicit >> zipIt.vbs
echo Dim FileToZip, Result >> zipIt.vbs
echo Dim oShell >> zipIt.vbs
echo Dim file >> zipIt.vbs
echo Dim oFileSys >> zipIt.vbs
echo Dim winShell >> zipIt.vbs
echo FileToZip = "%%c" >> zipIt.vbs
echo Result = "%%c.zip" >> zipIt.vbs
echo Set oShell = CreateObject("WScript.Shell"^) >> zipIt.vbs
echo Set oFileSys = CreateObject("Scripting.FileSystemObject"^) >> zipIt.vbs
echo Set file = oFileSys.CreateTextFile(Result, True^) >> zipIt.vbs
echo file.Write "PK" ^& Chr(5^) ^& Chr(6^) ^& String(18, 0^) >> zipIt.vbs
echo file.Close >> zipIt.vbs
echo Set file = nothing >> zipIt.vbs
echo set winShell = createObject("shell.application"^) >> zipIt.vbs
Timeout /T 10
echo winShell.namespace(Result^).CopyHere FileToZip >> zipIt.vbs
Timeout /T 10
echo wScript.Sleep(30000^) >> zipIt.vbs

REM Delete the file
echo oFileSys.DeleteFile FileToZip >> zipIt.vbs
CScript zipIt.vbs

要压缩的文件大小不同。 因此,最好不要为较小的文件等待 30 秒。

echo winShell.namespace(Result^).CopyHere FileToZip >> zipIt.vbs
Timeout /T 10
echo wScript.Sleep(30000^) >> zipIt.vbs

REM Delete the file
echo oFileSys.DeleteFile FileToZip >> zipIt.vbs

CopyHere 方法需要休眠时间才能将文件复制到创建的空 zip 文件中。

例如,如果压缩一个大小为 500 MB 的文件需要 30 秒,那么当文件大小为 100 MB 时,我不希望脚本等待 30 秒。

我们可以让脚本等待压缩文件所需的时间吗? VBScript中有什么命令或函数吗?

感谢您的帮助。

【问题讨论】:

  • 您是否总是在同一台计算机上执行此操作,您要压缩的文件内容是否基本相同?如果是这样,您可以对压缩 100,200,300,400 等 meg 文件进行一些性能比较,并相应地设置睡眠。
  • 总是在同一台电脑上做。模式和内容将是相似的。可以有多个不同大小的文件。
  • 您是将多个文件添加到一个 zip 文件中,还是创建一个包含 1 个文件的 zip 文件?
  • 另外,如果它是一个只有一个文件的单个 zip 文件,它是目录中唯一的文件还是同一目录中的其他文件没有被压缩?
  • 目录中有很多不应该压缩的文件。名称中具有相同模式的文件 %1%filename*.* 被压缩。每次for 循环运行并在 zip 文件中添加单个文件。

标签: file vbscript batch-file windows-server-2008


【解决方案1】:

您不需要休眠,CScript zipIt.vbs 将一直运行,直到所有文件都被压缩。

但是,如果您确实遇到时间问题,我建议您从 vbScript 中取出 .DeleteFile,并使用 del 实用程序在批处理脚本中执行此操作。

另一种解决方案是将批处理文件更改为一个大的 vbScript。

【讨论】:

  • 感谢您的快速回复。如果我没有给予足够的睡眠,vbScript 将在这一行抛出 Permission denied 错误:echo oFileSys.DeleteFile FileToZip >> zipIt.vbs 并且无法删除文件。正如您所说,让我尝试在批处理脚本中执行此操作。无论我得到什么,都会很快回来。
  • 您提到的 rem 实用程序是什么?我尝试使用del "%%c" 它会按预期删除文件。但是,问题是,CScript 不等待文件被压缩。它等待睡眠时间并返回批处理脚本。还有其他想法吗?
【解决方案2】:

如果您使用带有 -m 选项的 winrar,您需要批处理或 vbs,该选项将在压缩阶段结束时将所有文件移动到 archve(因此会破坏原始文件)。我知道 winrar 是必须支付的原则,并且通常比 7zip 等现代 zip 实现要好,但通常它仍然是最好的。

【讨论】:

  • 脚本必须计划在 Windows Server 2008 上运行,并且没有使用任何第三方工具的范围。该任务需要使用 Windows 内置功能来完成。感谢您的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
  • 2013-03-30
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 1970-01-01
  • 2015-01-31
相关资源
最近更新 更多