我知道这个问题已经在另一个问题中得到了回答,但我就是不明白它是如何做到的。
我正试图将命令行程序(Aria2下载器)的输出转换为HTA脚本,以便可以解析和下载百分比,文件大小等可以获得并动态更新为DIV。
这是我已经调整并一直试图使用的代码,但它只是锁定界面,直到命令行完成,然后显示所有输出,而不是显示它,当它通过。
Const WshRunning = 0
Const WshFinished = 1
Const WshFailed = 2
strCommand = "ping.exe 127.0.0.1"
Set WshShell = CreateObject("WScript.Shell")
Set WshShellExec = WshShell.Exec(strCommand)
Do While WshShellExec.Status = WshRunning
window.setTimeOut "", 100
Loop
Select Case WshShellExec.Status
Case WshFinished
strOutput = WshShellExec.StdOut.ReadAll()
Case WshFailed
strOutput = WshShellExec.StdErr.ReadAll()
End Select
Set objItem = Document.GetElementByID("status")
objItem.InnerHTML = "" & strOutput & ""
我如何修改这一点,使它不会锁定我的用户界面,并抓住输出,并显示在"状态"div,因为它通过?
问题是您的代码没有结束,而是将控件返回给浏览器。直到程序结束,您才离开循环,并且感知到的状态是接口挂起,直到子进程结束。
你需要设置一个回调,这样浏览器就会定期调用你的代码,在那里你将更新状态并离开。
<html>
<head>
<title>pingTest</title>
<HTA:APPLICATION
APPLICATIONNAME="pingTest"
ID="pingTest"
VERSION="1.0"
/>
</head>
<script language="VBScript">
Const WshRunning = 0
Const WshFinished = 1
Const WshFailed = 2
Dim WshShellExec, Interval
Sub Window_onLoad
LaunchProcess
End Sub
Sub LaunchProcess
Set WshShellExec = CreateObject("WScript.Shell").Exec("ping -n 10 127.0.0.1")
Interval = window.setInterval(GetRef("UpdateStatus"),500)
End Sub
Sub UpdateStatus
Dim status
Set status = Document.GetElementByID("status")
Select Case WshShellExec.Status
Case WshRunning
status.InnerHTML = status.InnerHTML & "<br>" & WshShellExec.StdOut.ReadLine()
Case WshFinished, WshFailed
status.InnerHTML = status.InnerHTML & "<br>" & Replace(WshShellExec.StdOut.ReadAll(),vbCRLF,"<br>")
window.clearInterval(Interval)
Interval = Empty
End Select
End Sub
</script>
<body>
<div id="status"></div>
</body>
</html>