我试图通过eac3to.exe的名称为CLI程序设计一个前端GUI。我看到的问题是,这个程序将所有的输出发送到cmd窗口。这给我带来了无穷无尽的麻烦,因为我需要将大量输出输入GUI窗口。这听起来很简单,但我开始怀疑我是否发现了AutoIt的一个局限性?
我可以使用运行()函数与windows内部命令,如Dir,然后得到输出到一个变量与AutoIt StdoutRead()
函数,但我只是不能得到输出从一个外部程序,如eac3to.exe
-它只是似乎不工作,无论我做什么!只是为了测试的目的,我甚至不需要得到输出到一个GUI窗口:只是用ConsoleWrite()
打印它是足够好的,因为这证明我能够读取它到一个变量。所以在这个阶段,这就是我所需要做的——把外部CLI程序输出到cmd窗口的文本(通常大约10行)输入到一个变量中。一旦我能做到这一点,剩下的就容易多了。这是我一直在尝试,但它从来没有工作:
Global $iPID = Run("C:VIDEO_EDITINGeac3toeac3to.exe","", @SW_SHOW)
Global $ScreenOutput = StdoutRead($iPID)
ConsoleWrite($ScreenOutput & @CRLF)
运行此脚本后,所有我从consolWrite()
得到的是一个空白行-而不是作为运行eac3to.exe
的结果输出的文本数据(运行eac3to没有任何参数只是列出了与所有命令行选项相关的帮助文本屏幕),这就是我试图进入一个变量,以便我可以把它放在以后的程序中使用。
在我提出解决方案之前,让我告诉你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_EDITINGeac3toeac3to.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)