2

在我创建的几个 .HTA 脚本中,我需要 VBScript WScript.Sleep 命令,它只是等待几毫秒而不使用 CPU。当我浏览网页时,似乎我并不是唯一一个在寻找这个的人:

https://www.google.nl/search?q=hta+sleep

(我敢打赌,如果你读到这个,你可能也需要(ed)这个)

我能找到的最佳解决方案似乎是使用 PING 命令的解决方案。但特别是对于只需要暂停脚本几 100 毫秒的情况,这个解决方案非常奇怪,因为它使用外部命令并触发所有类型的(网络)进程,这些进程不太可能与相关的 .HTA 脚本有任何关系。

所以我首先想到的是使用 WMI Win32_PingStatus 类来避免外部命令,但后来我开始质疑为什么不完全基于 WMI。我花了几个小时才找到正确的 WMI 类和方法,但最后我成功了……</p>

4

5 回答 5

3

在编写 HTA 时,您应该异步思考。考虑重写您的代码以使用window.setTimeout. 在以下示例中,我将使用window.setTimeout每 2 秒发出一次铃声:

<!DOCTYPE html>
<html>
<head>
<meta http-equiv="x-ua-compatible" content="ie=8">
<title>Bell Test</title>
<script language="VBScript">
Option Explicit
Dim objWShell
Set objWShell = CreateObject("WScript.Shell")
Sub DoPing
    divText.innerText = Now
    objWShell.Run "%COMSPEC% /c ECHO " & Chr(7), 0, False
    window.setTimeOut "DoPing", 2000
End Sub
Sub window_OnLoad
   window.ResizeTo 240,130
   DoPing
End Sub
</script>
</head>
<body>
<div id="divText">TEST</div>
</body>
</html>
于 2015-02-11T15:37:44.213 回答
2

我对 HTA 也有同样的问题。我的 vbs 解决方案...

Sub sleep (Timesec)
    Set objwsh = CreateObject("WScript.Shell") 
    objwsh.Run "Timeout /T " & Timesec & " /nobreak" ,0 ,true
    Set objwsh = Nothing
End Sub

' example wait for 3 seconds
sleep 3

该例程将调用一个外壳命令,最小化并且没有键盘命令。只允许 ^C,但在这些情况下不会给出用户。

于 2015-05-08T23:47:54.137 回答
1
Sub Sleep(iMilliSeconds)

    With GetObject("winmgmts:\\.\root\cimv2")
        With .Get("__IntervalTimerInstruction").SpawnInstance_()
            .TimerId = "Sleep"
            .IntervalBetweenEvents = iMilliSeconds
            .Put_()
        End With
        .ExecNotificationQuery("SELECT * FROM __TimerEvent WHERE TimerId='Sleep'").NextEvent
    End With

End Sub

2015 年 2 月 11 日添加:

不幸的是,在使用 Internet Explorer 10 时,此功能不起作用(请参阅下面的评论)。安装 Internet Explorer 11 后,如果您以管理员身份运行 HTA,它似乎可以工作。

于 2013-05-31T20:25:37.767 回答
0

Wait(2000) '暂停 2 秒

Sub Wait(Time)
  Dim wmiQuery, objWMIService, objPing, objStatus
  wmiQuery = "Select * From Win32_PingStatus Where Address = '1.1.1.1' AND Timeout = " & Time
  Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
  Set objPing = objWMIService.ExecQuery(wmiQuery)
  For Each objStatus in objPing
  Next
End Sub
于 2014-10-01T10:25:51.347 回答
0
Sub Sleep (ms) 
  Set fso = CreateObject("Scripting.FileSystemObject") 
  Dim sFilePath: sFilePath = fso.GetSpecialFolder(2) & "\WScriptSleeper.vbs"
  If Not fso.FileExists(sFilePath) Then
      Set oFile = fso.CreateTextFile(sFilePath, True)
      oFile.Write "wscript.sleep WScript.Arguments(0)"
      oFile.Close
  End If

  Dim oShell: Set oShell = CreateObject("WScript.Shell")
  oShell.Run sFilePath & " " & ms, 1, True
End Sub
于 2019-07-09T05:17:30.227 回答