在我创建的几个.HTA脚本中,我需要VBScript WScript.Sleep命令,它只需等待几毫秒而不使用CPU。 当我浏览网页时,似乎我不是唯一一个在寻找这个的人:
https://www.google.nl/search?q=hta+sleep
(我敢打赌,如果你读到这个,你可能也需要(编辑)这个)
我能找到的最佳解决方案似乎是使用PING命令的解决方案。 但特别是对于一种情况只需要暂停脚本几百毫秒,这个解决方案很安静,因为它使用外部命令并触发所有类型的(网络)进程,这些进程不太可能与相关的.HTA脚本有任何关系。
所以我想到的第一件事是使用WMI Win32_PingStatus类来避免外部命令,但后来我开始质疑为什么不完全基于WMI。 我花了几个小时来获得正确的WMI类和方法,但最后我成功了......
答案 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