Search code examples
vbscript

WScript.Shell.Exec - read output from stdout


My VBScript does not show the results of any command I execute. I know the command gets executed but I would like to capture the result.

I have tested many ways of doing this, for example the following:

Const WshFinished = 1
Const WshFailed = 2
strCommand = "ping.exe 127.0.0.1"

Set WshShell = CreateObject("WScript.Shell")
Set WshShellExec = WshShell.Exec(strCommand)

Select Case WshShellExec.Status
   Case WshFinished
       strOutput = WshShellExec.StdOut.ReadAll
   Case WshFailed
       strOutput = WshShellExec.StdErr.ReadAll
 End Select

WScript.StdOut.Write strOutput  'write results to the command line
WScript.Echo strOutput          'write results to default output

But it does not print any results. How do I capture StdOut and StdErr?


Solution

  • WScript.Shell.Exec() returns immediately, even though the process it starts does not. If you try to read Status or StdOut right away, there won't be anything there.

    The MSDN documentation suggests using the following loop:

    Do While oExec.Status = 0
         WScript.Sleep 100
    Loop
    

    This checks Status every 100ms until it changes. Essentially, you have to wait until the process completes, then you can read the output.

    With a few small changes to your code, it works fine:

    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
         WScript.Sleep 100
    Loop
    
    Select Case WshShellExec.Status
       Case WshFinished
           strOutput = WshShellExec.StdOut.ReadAll()
       Case WshFailed
           strOutput = WshShellExec.StdErr.ReadAll()
     End Select
    
    WScript.StdOut.Write(strOutput)  'write results to the command line
    WScript.Echo(strOutput)          'write results to default output