2016-09-24 55 views
0

我试图通过eac3to.exe的名称为CLI程序设计一个前端GUI。我看到的问题是,该程序将它的所有输出发送到cmd窗口。这给了我无尽的麻烦,因为我需要在GUI窗口中获得大量输出。这听起来很容易,但我开始想知道我是否找到了AutoIt的限制之一?AutoIt为外部CLI程序编写脚本 - eac3to.exe

我可以使用Run()函数与Windows内部命令,如Dir,然后使用AutoIt StdoutRead()函数获取输出到一个变量,但我不能从外部程序获得输出,如eac3to.exe - 我似乎无法工作!仅用于测试目的,我甚至不需要将输出传送到GUI窗口:只需使用ConsoleWrite()进行打印就足够了,因为这证明我能够将其读入变量。所以在这个阶段,我需要做的就是 - 将通过外部CLI程序输出到cmd窗口的文本(通常约10行)获取到变量中。一旦我可以做到这一点,其余的将会更容易。这是我一直什么努力,但它永远不会奏效:

Global $iPID = Run("C:\VIDEO_EDITING\eac3to\eac3to.exe","", @SW_SHOW) 
Global $ScreenOutput = StdoutRead($iPID) 
ConsoleWrite($ScreenOutput & @CRLF) 

运行此脚本所有我从consolWrite()得到的是一个空行之后 - 不,是因为运行eac3to.exe的结果输出的文本数据(运行没有任何参数的eac3to只是列出了与所有命令行选项相关的帮助文本的屏幕),这就是我想要进入变量的内容,以便稍后在程序中使用它。

+0

[相关](https://stackoverflow.com/a/27663324/4157124)。 – user4157124

回答

1

在我建议解决方案之前,让我告诉你,Autoit有一个 最好的帮助文件。用它。

您缺少$STDOUT_CHILD = Provide a handle to the child's STDOUT stream。 另外,您不能只是执行RUN并立即调用stdoutRead。您在什么时候给应用程序一些时间来做任何事情,然后将某些内容打印回控制台?

您需要使用ProcessWaitClose,然后读取流,或者您应该循环读取流。最简单的检查是在RUN和READ之间设置睡眠,看看会发生什么。

#include <AutoItConstants.au3> 

Global $iPID = Run("C:\VIDEO_EDITING\eac3to\eac3to.exe","", @SW_SHOW, $STDOUT_CHILD) 


; Wait until the process has closed using the PID returned by Run. 
ProcessWaitClose($iPID) 

; Read the Stdout stream of the PID returned by Run. This can also be done in a while loop. Look at the example for StderrRead. 
; If the proccess doesnt end when finished you need to put this inside of a loop. 
Local $ScreenOutput = StdoutRead($iPID) 


ConsoleWrite($ScreenOutput & @CRLF)