如何在VBScript中设置延迟

58

如何在vbscript中设置延迟?

WScript.Sleep(100) 在Windows XP,Vista上无效。


4
WScript.Sleep(100)在Windows XP和Vista上无法工作。”实际上它可以(在XP上进行了测试)。这条命令会等待100毫秒(即1/10秒)。如果您想要等待100,请使用100 * 1000,因为时间单位是毫秒。由于这是VBScript,所以您不需要使用括号。尽管使用括号不会出错,但也不是正确的写法。 - T.J. Crowder
尝试使用 WSH.Sleep 1000 - user9556248
12个回答

67

做这个(XP)。

创建一个新文件,将其命名为test.vbs。将以下内容放入其中。

WScript.Sleep 1000
MsgBox "TEST"

运行它,注意弹出消息框之前的延迟。

请注意,数字以毫秒为单位,因此1000表示1秒。


4
去掉 ")",并将 "(" 替换为空格,以使代码成为有效的VBScript。 - Ekkehard.Horner

38

如果你想在VBScript中模拟睡眠延迟,但WScript不可用(例如:你的脚本是从Microsoft的BGInfo工具中调用的),请尝试以下方法。

下面的示例将延迟到从处理指令的时刻起10秒钟:

Dim dteWait
dteWait = DateAdd("s", 10, Now())
Do Until (Now() > dteWait)
Loop

10
它可以运行...但我担心这种解决方案的CPU使用率(它是一个长循环)。也许在没有WScript可用的脚本中,您可以使用CreateObject调用它,就像这个答案中所示:https://dev59.com/0G855IYBdhLWcg3w_5qm#4037208 - Stefano
适用于IE 11。 - Flea
2
糟糕的解决方案。但是如果某件事情很愚蠢,但它能够运行……那么它就不是愚蠢的。 - Jakub Szułakiewicz
曾经为一个HTA工作过,其中无法读取我创建的WScript shell对象以执行objShell.Sleep()WScript.Sleep()。所以我使用了Paulie的方法。但有一个注意点:在Chrome中,如果你设置超过1秒的等待时间,它会弹出一个窗口询问是否要等待脚本响应。你可以选择“是”,然后它就能正常工作,但这可能会让很多非技术人员感到惊慌。 - vapcguy
'''在HTA内部从vbs调用延迟(5秒)
Set wshShell = CreateObject("WScript.Shell")
strCmd = wshShell.ExpandEnvironmentStrings("%COMSPEC% /C (TIMEOUT.EXE /T 5 /NOBREAK)")
wshShell.Run strCmd, 0, 1
Set wshShell = Nothing
- Steve Wasiura

26

如果是VBScript,应该是这样的:

WScript.Sleep 100

如果它是JavaScript

WScript.Sleep(100);

以毫秒为单位的时间。WScript.Sleep 1000 会导致程序休眠1秒钟。


@badbod99 这就像是说:只要你没有被抓,偷东西和买东西一样有效。"someSub (param)" 会将 param 的 副本 传递给 someSub。 - Ekkehard.Horner

13

以下代码将使您的脚本休眠5分钟。

WScript.Sleep 5*60*1000

请注意,传递给sleep调用的值是以毫秒为单位的。


12

这里很多答案都假设您的VBScript在Windows脚本宿主中运行(通常是wscript.execscript.exe),如果您遇到类似“变量未定义:"WScript"”的错误,那么您可能没有在使用。

只有在Windows脚本宿主下才能使用WScript对象,如果您在另一个脚本宿主下运行,比如Internet Explorer的脚本宿主(如果您正在使用HTA之类的东西并且没有意识到它),WScript不会自动可用。

Microsoft的Hey, Scripting Guy!博客有一篇文章涉及了这个话题《如何暂停HTA中的脚本》。在其中,他们使用VBScript的setTimeout创建一个计时器来模拟Sleep,而无需使用占用CPU资源的循环等。

使用的代码如下:

<script language = "VBScript">

    Dim dtmStartTime

    Sub Test
        dtmStartTime = Now 
        idTimer = window.setTimeout("PausedSection", 5000, "VBScript")
    End Sub

    Sub PausedSection
        Msgbox dtmStartTime & vbCrLf & Now
        window.clearTimeout(idTimer)
    End Sub

</script>

<body>
    <input id=runbutton  type="button" value="Run Button" onClick="Test">
</body>

请查看链接的博客文章获取完整的解释,但基本上当按钮被点击时,它会创建一个定时器,该定时器将从现在起延迟5,000毫秒后触发,并且当它触发时运行名为“PausedSection”的VBScript子例程,该子例程清除定时器并运行您想要执行的任何代码。


7
这里有另一种选择:
Sub subSleep(strSeconds) ' subSleep(2)
    Dim objShell
    Dim strCmd
    set objShell = CreateObject("wscript.Shell")
    'objShell.Run cmdline,1,False

    strCmd = "%COMSPEC% /c ping -n " & strSeconds & " 127.0.0.1>nul"     
    objShell.Run strCmd,0,1 
End Sub 

4
更好地使用计时器:
Sub wait (sec)
    dim temp
    temp=timer
    do while timer-temp<sec
    loop
end Sub

这是一个很好的解决方案,非常直接,但是当在HTA内部运行时,它会生成一个无响应脚本警报,询问您是否要停止运行脚本,因为它可能会锁定您的计算机。您可以选择不停止,但它仍然会中断程序的正常流程。 - freginold

4

“睡眠函数”的时间单位是毫秒(ms)。

如果你想要3分钟,可以这样做:

WScript.Sleep(1000 * 60 * 3)

5
违反规则:在调用Sub过程时不要加()。 - Ekkehard.Horner
4
然而,它确实是有效的VBScript。它明确传递了“ByVal”值。我永远不会使用那样的括号;我会写成“Call WScript.Sleep(…)”。 - Toothbrush

4

这是我的解决方案。通过脚本工作,该脚本由第三方程序运行,没有声明WScript且不允许导入。

Function MySleep(milliseconds)
  set WScriptShell = CreateObject("WScript.Shell")
  WScriptShell.Run "Sleep -m " & milliseconds, 0, true
end Function

更新
看起来微软已经从win 8中删除了Sleep.exe,所以这在win 8上无法工作,除非您将Sleep.exe放在%path%定义的文件夹中。


3
这里是对@user235218提供的解决方案的更新,它允许您指定所需的毫秒数。
注意:-n选项是重试次数,-w是ping操作超时的毫秒数。我选择了127.255.255.254地址,因为它在回环范围内,而ms windows不会响应它。
我也怀疑这并不提供毫秒级的精度,但另一方面,我尝试在一个使用ms脚本控件的应用程序中,内置的sleep函数锁定了界面,而这种方法则没有。
如果有人能够解释为什么这种方法没有锁定界面,我们可以使这个答案更完整。两个睡眠函数都在用户线程中运行。
Const WshHide = 0
Const WAIT_ON_RETURN = True

Sub Sleep(ByVal ms)

   Dim shell 'As WScript.Shell

   If Not IsNumeric(ms) Then _
       Exit Sub

   Set shell = CreateObject("WScript.Shell")

   Call shell.Run("%COMSPEC% /c ping -n 1 -w " & ms & " 127.255.255.254 > nul", WshHide, WAIT_ON_RETURN)

End Sub

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接