3

I know this has been answered one in another question, but I simply do not understand how it is done.

I am trying to get the output of a command line program (Aria2 downloader) into a HTA script so it can be parsed and the download percentage, file size etc can be obtained and updated into a DIV dynamically.

Here is the code I have adjusted and have been trying to use but it just locks up the interface until the command line has finished and THEN displays all the output, instead of displaying it as and when it comes through.

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

How do I modify this so that it doesn't lock up my user interface and grabs the output and displays it in the "status" div as it comes through?

1

1 Answer 1

3

The problem is that your code does not end, returning the control to the browser. You don't leave the loop until the program ends and the perceived status is that the interface hangs until the subprocess ends.

You need to set a callback so the browser will periodically call your code where you will update the status and leave.

<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>
Sign up to request clarification or add additional context in comments.

8 Comments

Thank you very much, I get the concept now, that was very eloquently put, thanks. Why is the WshRunning line written like so: status.InnerHTML = status.InnerHTML & "<br>" & WshShellExec.StdOut.ReadLine() Would it not work as status.InnerHTML = WshShellExec.StdOut.ReadLine() ??
@Ctrlaltdenied, I was trying to keep all the output from the command while reading it. Each time a ReadLine is used, only one line is retrieved, so, to keep all the output the new line is appended to the end of the existing information. Of course the code in your comment will work, but will not show the same information. For each line you discard the previously retrieved information and replace it with the new line.
Ok, so the main reason behind this code, was to initiate a download, of which Aria2 is awesome at, http/s, bittorrent etc. I would like to expand this and have the entire log written to a log.txt file, whilst keeping key elements of the output to be displayed on the page. i.e the relevant download info like amount downloaded / total download size, speed, percentage etc. Thanks again for your help.
Oh, just to query as final thing, the command in this example is ping -n 10 127.0.0.1, are there any characters or symbols (other than " that would not be accepted, and if I need to enter in a command that has a " in it as part of the string, do I need to make allowances here?
@Ctrlaltdenied, if you are directly calling the aria executable there should not be any problematic character except 0x00 (null character). Quotes are allowed, but to include them in vbs strings you have to double them, just the vbs syntax way to escape quotes.
|

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.