2015-10-03 7 views
3

Я знаю, что на этот вопрос ответили один на другой вопрос, но я просто не понимаю, как это делается.VBScript - Захват вывода из stdout

Я пытаюсь получить вывод программы командной строки (загрузчик Aria2) в сценарий HTA, чтобы он мог быть проанализирован, и процент загрузки, размер файла и т. Д. Можно получить и обновить в DIV динамически.

Вот код, который я настроил и пытаюсь использовать, но он просто блокирует интерфейс до окончания командной строки, а THEN отображает весь вывод, вместо того, чтобы отображать его как и когда он приходит.

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 & "" 

Как изменить это так, чтобы она не блокирует мой пользовательский интерфейс и хватает вывода и отображает его в «статус» ДИВ, как это происходит через?

+0

В чем заключается основа «Const WshFailed = 2»? MS-документы не имеют такого кода состояния. https://msdn.microsoft.com/en-us/subscriptions/443b45a5(v=vs.84).aspx – ChrisJJ

ответ

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> 
+0

Огромное спасибо, я поняла концепцию, которая была очень красноречиво поставлена, спасибо. Почему WshRunning линия написана так: status.InnerHTML = status.InnerHTML & "
" и WshShellExec.StdOut.ReadLine() бы не работать status.InnerHTML = WshShellExec.StdOut.ReadLine() ?? – Ctrlaltdenied

+1

@Ctrlaltdenied, я пытался сохранить весь вывод команды во время чтения. Каждый раз, когда используется «ReadLine», извлекается только одна строка, поэтому, чтобы сохранить весь вывод, добавляется новая строка в конец существующей информации. Конечно, код в вашем комментарии будет работать, но не покажет ту же информацию. Для каждой строки вы отбрасываете ранее полученную информацию и заменяете ее новой строкой. –

+0

Итак, основная причина этого кода заключалась в том, чтобы инициировать загрузку, из которой Aria2 является awesome at, http/s, bittorrent и т. Д. Я хотел бы расширить это и записать весь журнал в файл log.txt, сохраняя ключевые элементы вывода для отображения на странице. i.e релевантная информация о загрузке, например, объем загружаемой/общей загрузки, скорость, процент и т. д. Еще раз спасибо за вашу помощь. – Ctrlaltdenied

Смежные вопросы