来自WScript.Shell Exec的实时控制台输出

Sky*_*nel 5 console vbscript vba wsh excel-vba

我花了大部分时间寻找解决方案,我开始认为它可能不符合我的要求

我的基本设置是运行从excel vba代码调用的vbscript(.vbs).vba代码必须继续运行并使vbscript保持运行,但会不时使用它进行监视Exec.Status

在vbscript中,我用它WScript.StdOut.WriteLine "whatever"来跟踪/调试它的进度,但就目前而言,我只能在excel vba代码完成后才能读取它的输出.

我想要的是从vbscript看到实时输出到控制台

这是vba代码......

Dim WSH As IWshRuntimeLibrary.WshShell   'Windows Script Host Object Model
Dim Exec As WshExec 

Set WSH = CreateObject("WScript.Shell")
Set Exec = WSH.Exec("%COMSPEC% /C CSCRIPT.EXE //nologo " _
    & VbsFileDir _
    & " " & Arg1 _
    & " " & Arg2 _
    & " " & Arg3 _
    & " " & Arg4)
Run Code Online (Sandbox Code Playgroud)

我已经能够通过转换来获得实时输出WSH.ExecWSH.Run,但我确实需要访问Exec.Status,这是不是可以下WSH.Run


更新 - 2015-02-06

进一步澄清......使用@ Ekkehard.Horner提供的示例'... B.vbs'代码答案......以下excel-vba代码将向控制台显示实时输出...

WSH.Run("cscript C:\28353522-B.vbs")
Run Code Online (Sandbox Code Playgroud)

...但以下内容不会向控制台显示任何内容

WSH.Exec("cscript C:\28353522-B.vbs")
Run Code Online (Sandbox Code Playgroud)

我无法使用,.Run()因为我使用了.Status标志.Exec() 而且我不能只将vbscript移动到VBA代码中,因为VBA继续与vbscript并行执行其他任务.

Ps如果有人能提交答案解释为什么不能这样做,那么我会将其标记为已接受.

Ekk*_*ner 3

使用 .Stdout.ReadLine() 直到该过程完成,然后使用 .Stdout.ReadAll() 来获取其余输出 - 如

28353522-A.vbs

Option Explicit

Const WshFinished = 1

Dim oExc : Set oExc = CreateObject("WScript.Shell").Exec("cscript 28353522-B.vbs")
WScript.Echo "A", "start"
Do While True
   If oExc.Status = WshFinished Then
      WScript.Echo "A", "WshFinished"
      Exit Do
   End If
   WScript.Sleep 500
   If Not oExc.Stdout.AtEndOfStream Then WScript.Echo "A", oExc.Stdout.ReadLine()
Loop
If Not oExc.Stdout.AtEndOfStream Then WScript.Echo "A", oExc.Stdout.ReadAll()
Run Code Online (Sandbox Code Playgroud)

28353522-B.vbs

Option Explicit

Dim i
For i = 1 To 10
    WScript.Echo "B", i, "whatever"
    WScript.Sleep 100
Next
Run Code Online (Sandbox Code Playgroud)

输出:

cscript 28353522-A.vbs
A start
A B 1 whatever
A B 2 whatever
A B 3 whatever
A WshFinished
A B 4 whatever
B 5 whatever
B 6 whatever
B 7 whatever
B 8 whatever
B 9 whatever
B 10 whatever
Run Code Online (Sandbox Code Playgroud)

顺便说一句 - 你是如何使用 .Run() 获得实时输出的?