VBScript - захват вывода из стандартного вывода
Я знаю, что на этот вопрос ответили один на другой, но я просто не понимаю, как это делается.
Я пытаюсь получить выходные данные программы командной строки (загрузчик 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 & ""
Как мне изменить это так, чтобы он не блокировал мой пользовательский интерфейс, не захватывал выходные данные и не отображал их в "статусном" диве по мере прохождения?
1 ответ
Проблема в том, что ваш код не заканчивается, возвращая управление браузеру. Вы не выходите из цикла до тех пор, пока программа не завершится, и воспринимается состояние, что интерфейс зависает до завершения подпроцесса.
Вам нужно установить обратный вызов, чтобы браузер периодически вызывал ваш код, где вы будете обновлять статус и выходить.
<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>