执行外部程序和读取输出

时间:2015-12-30 02:04:51

标签: windows vbscript cmd output io-redirection

我尝试编写一个VBScript,它将执行外部程序并从程序的执行中读取输出。我使用这段代码:

compare()

我看到cmd已执行并返回输出但重定向文件始终为0kb且为空。

我还设法使用以下代码重定向输出:

Option Explicit
Dim Title,ws,Command,Exec,FileExe,param1
FileExe = "ping.exe"
param1 = "127.0.0.1 "

MeHappy FileExe,param1

Function MeHappy(FileExe, param1)
    Dim Title, ws, Command, Exec
    Title = "Test "
    Set ws = CreateObject("wscript.Shell")
    command = "cmd /c Start "& FileExe &" "& param1 &">test.txt "
    Msgbox command, 64, Title
    Exec = ws.run(command, 0, True) 
End Function

并且文件正确,包含Set WshShell = WScript.CreateObject("WScript.Shell") Return = WshShell.Run("cmd /c ping.exe 127.0.0.1 > test.txt", 1, True) 的输出。

但是当我尝试启动其他外部程序时,我偶然发现了另一个问题。我调用的外部程序正在调用另一个exe程序,我无法读取整个输出。

例如,如果我有ping.exe,并且test.exe本身正在调用另一个另一个exe文件(例如test.exe),那么我就不会收到整个输出。我只收到来自test1.exe的输出,因为可能test.exe仅调用test.exe并且它不等待test1.exe或其他任何内容。

我可以从任务管理器中查看。我看到test1.exe已完成执行,并且生成了带输出的文件,但test.exe仍在运行,完成后文件中没有输出,但是如果我从cmd定期运行(没有脚本)只有示例test1.exe,我可以看到test和test1的整个输出。

使用第一个脚本,如果我执行test.exe,我看到整个输出,但重定向文件总是为空,第二个脚本我不接收整个输出。外部程序是我无法控制的。

有关如何管理此事的任何建议吗?

1 个答案:

答案 0 :(得分:0)

如有疑问,请阅读documentation

  

开始
  [...]
  启动单独的命令提示符窗口以运行指定的程序或命令。

在另一个窗口中的输出无法在当前窗口中重定向。

改变这个:

command = "cmd /c Start "& FileExe &" "& param1 &">test.txt "

进入这个:

command = "cmd /c "& FileExe &" "& param1 &">test.txt"

问题就会消失。

另一种选择是使用整个命令(包括重定向)作为(嵌套)双引号中的命令字符串启动另一个CMD实例:

command = "cmd /c start cmd /c """& FileExe &" "& param1 &">test.txt"""
'                       ^^^^^^^^^                                   ^^

至于捕获孙子进程的输出:这在很大程度上取决于进程如何启动以及如何实际生成其输出。您可以尝试的一件事是绕过启动器并直接启动孙子进程。