HTA脚本的睡眠例程

时间:2013-05-31 20:25:38

标签: delay sleep wait hta

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

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

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

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

所以我想到的第一件事是使用WMI Win32_PingStatus类来避免外部命令,但后来我开始质疑为什么不完全基于WMI。 我花了几个小时来获得正确的WMI类和方法,但最后我成功了......

5 个答案:

答案 0 :(得分: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>

答案 1 :(得分: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

例程将调用shell命令,最小化并且没有键盘命令。 只允许^ C,但在这种情况下不会给用户。

答案 2 :(得分: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-02-11:

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

答案 3 :(得分:0)

等待(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

答案 4 :(得分: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