1

以前のトピックに関連するこの質問を書いています。

javaコードからbatファイルを実行して、txtファイルで目的の結果を取得します-できません:( 簡単に言うと、batファイルを実行するプログラムをJavaで書きました。このバット ファイルは、デスクトップ アプリケーション テストを実行する TestComplete8 スクリプトを実行します。テストが終了すると、bat ファイルは result.txt というファイルを生成し、テストに関する情報を出力します。現在、別の問題に悩まされています。Java コードから、バットの実行が完了するまで待ちたいと思います。そのために、result.txt というファイルが存在するまでループします。私が推測する最も良い解決策ではありませんが、うまくいくと思い、さまざまな解決策も試しました。何が起こるかというと、正常にループしてファイルが存在するまで待機しますが、testcomplete はテストを実行しません。testcomplete が実行されるため、非常に奇妙です。テストが開始され、AUT も開始されることがわかりますが、何も起こりません。Testcomplete は任意のオブジェクトを待機しており、' 任意の場所をクリックすると、事前定義されたアクションの時間がなくなるまで待機します。コードで待機せずにテストを実行すると、すべて問題ありません。待機が有効になっているときにテスト中に何も起こらない理由と、do-whileまたはwaitFor()を削除するだけで正常に動作する理由、または別のスレッドで実行しようとしてもうまくいかない理由がわかりません。:(

OSに何らかの形で関連している可能性があり、プロセスとしてバットのようなものを実行し、バットがtestcompleteまたはsthのような子プロセスを実行するため、プロセスと関係があると感じています。回答ありがとうございます

尋ねられたソースコード: 今、私は変更されたバットファイルで解決策を試していました:

@ECHO OFF
"C:\Program Files (x86)\Automated QA\TestComplete 8\Bin\TestComplete.exe" "C:..." /r /p:projname PathToApp="C:\...p" Login=... Password=B1  /t:"KeywordTests|..." /exit

最新バージョンで実行して待機するコードは次のとおりです。

        new Thread(new Runnable() {
        public void run() {
            File file = new File("D:\\");
            int exitValue = -1;

            try {
                Process process = Runtime.getRuntime().exec(batch, null, file);
                while (true) {
                    try {
                        exitValue = process.exitValue();
                        System.out.println(exitValue);
                        break;
                    } catch (IllegalThreadStateException e) {
                        // e.printStackTrace();
                        try {
                            Thread.sleep(1000);
                        } catch (InterruptedException e1) {
                            e1.printStackTrace();
                        }
                        System.out.println("Waiting for process...");
                    }
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }).start();
4

1 に答える 1

2

問題の詳細を知らなくても、最も可能性の高い原因は、Java から外部プロセスを起動するときに直面する一般的なものです。外部プロセスを起動すると、親プロセスと子プロセスの間に入力、出力、エラーの 3 つのストリームが作成されます。

これらは、System.in、System.out、および System.err に例えることができます。親プロセス (Java) が出力およびエラー ストリームのデータを積極的に消費しない場合、OS がストリームのバッファー制限に達し、それが消費されるまでそれ以上の書き込みが防止されるため、子プロセスがブロックされる可能性があります。これは、スクリプトが標準出力または標準エラーに書き込む場合に発生する可能性が非常に高いです。

Java プロセスの起動を処理するには、apache commons-exec を使用することをお勧めします。

これが私が知っているコードサンプルです。

    CommandLine commandLine = new CommandLine( "TestComplete8.bat" );
    commandLine.addArgument( ... );
    commandLine.addArgument( ... );

    DefaultExecutor executor = new DefaultExecutor();
    executor.setExitValue( 0 );
    ByteArrayOutputStream outputStream = new ByteArrayOutputStream();
    ByteArrayOutputStream errorStream = new ByteArrayOutputStream();
    executor.setStreamHandler( new PumpStreamHandler( outputStream, errorStream ) );

    try
    {
        executor.execute( commandLine );
    }
    catch ( ExecuteException e )
    {
        // TODO: ...
    }
    catch ( IOException e )
    {
        // TODO: ...
    }

次に、必要に応じて、execute が返されたときに出力/エラー ストリームを調べることができます。

于 2011-07-29T07:33:10.480 に答える