2016-09-24 17 views
0

CLIプログラムのフロントエンドGUIをeac3to.exeの名前で設計しようとしています。問題は、このプログラムがすべての出力をcmdウィンドウに送信することです。これは、私がGUIウィンドウにこの出力をたくさん集める必要があるので、私にはトラブルの終わりを与えません。これは簡単に聞こえますが、私はAutoItの限界を見つけたのかどうか疑問に思っています。外部CLIプログラムのAutoItスクリプティング - eac3to.exe

DirなどのWindows内部コマンドでRun()関数を使用して、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) 
関連する問題