Я использую JScript (такой же, как VBScript) изнутри .hta-файла, чтобы открыть новую команду оболочки и захватить ее вывод. Вот что я получил до сих пор после того, как Googling немного:Захват вывода из WScript.Shell в реальном времени
var shell = new ActiveXObject("WScript.Shell")
var e = shell.Exec("%comspec% /c ping google.com 2>&1 ")
while(!e.StdOut.AtEndofStream) {
var line = e.StdOut.ReadLine()
document.getElementById('log').value = line
}
Это работает. Однако он не является асинхронным. Цикл while заставляет мой .hta-интерфейс просто блокироваться (пользовательский интерфейс становится непригодным), пока команда оболочки не завершится. Если я удалю while loop
, команда shell.Exec
, похоже, не блокируется, поэтому проблема находится где-то внутри цикла.
Я думаю, что проблема блокировки возникает только потому, что я вхожу в среду .hta. Кажется, это не происходит, если я запускаю свой скрипт через командную строку, используя cscript.exe
Как я могу избежать поведения блокировки и получить доступ к выводам моей команды в режиме реального времени?
Цикл все еще блокируется в cscript.exe, но поскольку консольное окно управляется вспомогательным процессом (conhost/csrss), вы не замечаете блокировку (это нормально и нормально для консольного приложения) – Anders