【问题标题】:How to set delay in vbscript如何在 vbscript 中设置延迟
【发布时间】:2009-11-13 12:57:20
【问题描述】:

如何在vbscript中设置延迟?

WScript.Sleep(100) 不适用于 Windows XP、Vista。

【问题讨论】:

  • "WScript.Sleep(100) 在 Windows XP、Vista 上不工作" 是的,它可以(只是在 XP 中测试过)。它等待 100 毫秒(十分之一秒)。如果您想要 100 ,则使用 100 * 1000,因为该值以毫秒为单位。 (因为这是 VBScript,所以您不需要括号。它们实际上并没有破坏它,但它不是 正确...)
  • 试试WSH.Sleep 1000

标签: vbscript


【解决方案1】:

为此工作 (XP)。

创建一个新文件,命名为 test.vbs。把这个放进去。

WScript.Sleep 1000
MsgBox "TEST"

运行它,注意显示消息框之前的延迟。

注意,数字以毫秒为单位,所以 1000 是 1 秒。

【讨论】:

  • 删除 ) 并用空格替换 ( 以使代码有效 VBScript。
【解决方案2】:

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

下面的例子会延迟到指令处理后的 10 秒:

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

【讨论】:

  • 它可以工作......但我担心该解决方案的 CPU 使用率(这是一个很长的循环)。也许在没有可用 WScript 的脚本中,您可以使用 CreateObject 调用它,如此答案中所示:stackoverflow.com/a/4037208/460362
  • 在 IE 11 中工作。
  • 糟糕的解决方案。但是,如果某件事很愚蠢,但它确实有效……它并不愚蠢。
  • 为我的 HTA 工作,它不会读取我创建的用于执行 objShell.Sleep()WScript shell 对象,也不会读取 WScript.Sleep()。所以我改用保利的方法。一个警告:在 Chrome 中,如果你想等待脚本响应,如果你输入的时间超过 1 秒,它会给你那个弹出窗口。您可以说“是”,它会起作用,但它可能会吓坏许多非技术人员。
【解决方案3】:

如果是VBScript,应该是

WScript.Sleep 100

如果是 JavaScript

WScript.Sleep(100);

以毫秒为单位的时间。 WScript.Sleep 1000 导致 1 秒睡眠。

【讨论】:

  • @badbod99 这就像在说:只要你没有被抓到,偷作品和购买 - "someSub (param)" 会将参数的 copy 传递给一些子。
【解决方案4】:

这里的很多答案都假设您在 Windows 脚本主机(通常是 wscript.execscript.exe)中运行 VBScript。如果您遇到类似'Variable is undefined: "WScript"' 之类的错误,那么您可能不会。

WScript 对象仅在您在 Windows 脚本主机下运行时可用,如果您在另一个脚本主机下运行,例如 Internet Explorer 的(如果您处于类似HTA) 它不会自动可用。

Microsoft 的嗨,脚本专家!博客有一篇文章只涉及这个主题 How Can I Temporarily Pause a Script in an HTA?,其中他们使用 VBScript setTimeout 创建一个计时器来模拟睡眠,而无需使用 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>

请参阅linked blog post 以获得完整的解释,但本质上,当单击按钮时,它会创建一个从现在开始 5,000 毫秒触发的计时器,并且在触发时运行名为“PausedSection”的 VBScript 子例程,它会清除计时器,并运行你想要的任何代码。

【讨论】:

    【解决方案5】:

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

    WScript.Sleep 5*60*1000
    

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

    【讨论】:

      【解决方案6】:

      这是另一种选择:

      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 
      

      【讨论】:

        【解决方案7】:

        睡眠功能的时间以毫秒 (ms) 为单位

        如果你想要 3 分钟,那就这样做吧:

        WScript.Sleep(1000 * 60 * 3)
        

        【讨论】:

        • 又一次违反规则:调用Sub时No()。
        • @Ekkehard.Horner 但是,它有效的 VBScript。它显式传递值ByVal。我永远不会使用这样的括号;我会写Call WScript.Sleep(...)
        【解决方案8】:

        更好地使用计时器:

        Sub wait (sec)
            dim temp
            temp=timer
            do while timer-temp<sec
            loop
        end Sub
        

        【讨论】:

        • 这是一个很好的解决方案,非常简单,但是当从 HTA 内部运行时,它会生成一个无响应的脚本警报,询问您是否要停止运行该脚本,因为它可能会锁定您的计算机。你可以说不,但它仍然会打断程序的正常流程。
        【解决方案9】:

        这是我的解决方案。使用脚本,该脚本由第三方程序运行,没有声明 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% 中定义的文件夹中。

        【讨论】:

          【解决方案10】:

          这是@user235218 提供的解决方案的更新,允许您指定所需的毫秒数。

          注意:-n 选项是重试次数,-w 是 ping 的超时时间(以毫秒为单位)。我选择了 127.255.255.254 地址,因为它在环回范围内,ms windows 没有响应。

          我也怀疑这会提供毫秒精度,但另一方面,我在使用 ms 脚本控件的应用程序中尝试了它,而内置的睡眠功能锁定了该方法没有的接口。

          如果有人可以解释为什么这个方法没有锁定界面,我们可以让这个答案更完整。两个睡眠函数都在用户线程中运行。

          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

          【讨论】:

            【解决方案11】:

            answer中所述:

            Application.Wait (Now + TimeValue("0:00:01"))
            

            将等待 1 秒

            【讨论】:

              【解决方案12】:
              WScript.Sleep 100
              

              以下代码应该可以正常工作。

              【讨论】:

                猜你喜欢
                • 1970-01-01
                • 2013-03-30
                • 1970-01-01
                • 2022-06-10
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                • 2013-07-26
                • 2023-03-13
                相关资源
                最近更新 更多