Set wshShell = WScript.CreateObject ("WSCript.shell")
wshshell.run "runas ..."
How do I get the results and display in a MsgBox
Set wshShell = WScript.CreateObject ("WSCript.shell")
wshshell.run "runas ..."
How do I get the results and display in a MsgBox
You will want to use the WshShell object's Exec method instead of Run. Then simply read the command line's output from the standard streams. Try this one:
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
MsgBox strOutput 'write results in a message box
WshShellExec.Status
at Select Case
–
Dingy WshShellExec.Status <> 0
. –
Greenbelt Exec
is asynch, so WshShellExec.Status
is still 0 (running) at the time you first check it. You need to loop until it's done with something like While WshShellExec.Status = 0 : WScript.Sleep 50 : Wend
Perhaps consider editing your answer. –
Manuel This is a modified version of Nilpo's answer that fixes the issue with WshShell.Exec
being asynchronous. We do a busy-loop waiting until the shell's status is no longer running, and then we check the output. Change the command-line argument -n 1
to a higher value to make ping
take longer, and see that the script will wait longer until completion.
(If anyone has a true asynchronous, event-based solution to the problem, then please let me know!)
Option Explicit
Const WshRunning = 0
Const WshFinished = 1
Const WshFailed = 2
Dim shell : Set shell = CreateObject("WScript.Shell")
Dim exec : Set exec = shell.Exec("ping.exe 127.0.0.1 -n 1 -w 500")
While exec.Status = WshRunning
WScript.Sleep 50
Wend
Dim output
If exec.Status = WshFailed Then
output = exec.StdErr.ReadAll
Else
output = exec.StdOut.ReadAll
End If
WScript.Echo output
The solution of BoffinBrain still doesn't work, since exec.Status doesn't return an error level (returns just 0 while running and 1 when finished). For that purpose you must use exec.ExitCode (Returns the exit code set by a script or program run using the Exec() method.). So the solution changes to
Option Explicit
Const WshRunning = 0
' Const WshPassed = 0 ' this line is useless now
Const WshFailed = 1
Dim shell : Set shell = CreateObject("WScript.Shell")
Dim exec : Set exec = shell.Exec("ping.exe 127.0.0.1 -n 1 -w 500")
While exec.Status = WshRunning
WScript.Sleep 50
Wend
Dim output
If exec.ExitCode = WshFailed Then
output = exec.StdErr.ReadAll
Else
output = exec.StdOut.ReadAll
End If
WScript.Echo output
I think this makes the most sense. It is WshFinished, not WshFailed. I print the output as it comes, instead of at the end.
Function ExecCommand(cmd)
Const WshRunning = 0
Const WshFinished = 1
Dim objWshShell : Set objWshShell = CreateObject("WScript.Shell")
Dim oExec : Set oExec = objWshShell.Exec(cmd)
Do
'sleep in the loop before reading pipelines and reading finished state
WScript.Sleep 50
' We must read these, or it seems to block execution after 700 lines out output,
' probably because VBScript is blocking the pipeline, because script completes if VBScirpt is stoped with Ctrl-C
While oExec.StdOut.AtEndOfStream <> True
WScript.StdOut.WriteLine(oExec.StdOut.ReadLine())
Wend
While oExec.StdErr.AtEndOfStream <> True
WScript.StdErr.WriteLine("ERROR: " & oExec.StdErr.ReadLine())
Wend
Finished = ( oExec.Status = WshFinished )
Loop Until Finished
WScript.StdOut.WriteLine("ExitCode: " & oExec.ExitCode)
WScript.Quit(oExec.ExitCode) ' Optionally sets exit-code and exits this VbScript (but does not stop the executing sub-shell)
End Function
A good example is:
ExecCommand "ping.exe 127.0.0.1 -n 3 -w 500"
See error output with:
ExecCommand "cmd /c Echo Test Error >&2"
cscript.exe //nologo myscript.vbs
–
Konstantine var errorlevel = new ActiveXObject('WScript.Shell').Run(command, 0, true)
the third parameter must be true, and errorlevel will be return value, check if it is equal 0.
© 2022 - 2024 — McMap. All rights reserved.