我尝试编写一个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
,我看到整个输出,但重定向文件总是为空,第二个脚本我不接收整个输出。外部程序是我无法控制的。
有关如何管理此事的任何建议吗?
答案 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"""
' ^^^^^^^^^ ^^
至于捕获孙子进程的输出:这在很大程度上取决于进程如何启动以及如何实际生成其输出。您可以尝试的一件事是绕过启动器并直接启动孙子进程。