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.Exec到WSH.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如果有人能提交答案解释为什么不能这样做,那么我会将其标记为已接受.
使用 .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() 获得实时输出的?