2011-06-21 12 views
0

Javaプログラム内からバッチファイルを実行しようとしていますが、私はいくつかの奇妙な動作をしています。Javaプログラムからバッチファイルを実行するとパイプが破棄されますか?

Process p = Runtime.getRuntime().exec("cmd /c start temp.bat"); 

これは通常正常に実行されますが、バッチファイルの配管コマンドは機能しません。助言がありますか?

+0

これを実行すると、バッチファイル内の配管コマンドは機能しません(つまり、バッチファイルの出力をテキストに書き込むことができませんでした)ファイル)。私は、JREがInputStreamによるアクセスのためにこの出力を取得していたので、それがあると考えました。 –

+0

OKAY!最後に。私のIDE(Netbeans)と関係があることが判明しました。 IDEで自分のアプリケーションをテストすると、バッチファイルのパイプ処理が機能しません。しかし、IDEの外で実行すると(ビルドしてJARファイルを実行すると)、配管は正常に動作します。 –

答えて

1

私はあなたの人生を楽にしてくれるCommonsExecの使用をお勧めします。

CommandLine cmdLine = new CommandLine("ping"); 
cmdLine.addArgument(host); 

ByteArrayOutputStream stdout = new ByteArrayOutputStream(); 
PumpStreamHandler  psh = new PumpStreamHandler(stdout); 

DefaultExecutor executor = new DefaultExecutor(); 
executor.setStreamHandler(psh); 

try { 
    executor.execute(cmdLine); 
} catch (Exception e) { 
} 

System.out.println(stdout.toString()); 
+0

CommonsExecの概要とこのコードの機能について説明できますか? –

+0

Javaを介してポータブルな方法で外部アプリケーションを実行するためのラッパーライブラリです。 –

0

プロセスからストリームを処理しましたか?あなたがそれらを読まないなら、あなたのプロセスはハングします。

あなたの正確な問題は何ですか?

EDIT:は多分これanswerは、プロセスからのI/Oをリダイレクトするために、ProcessオブジェクトをあなたのgetOutputStream()とのgetInputStream()を使用して、あなたに

+0

私は実際にストリームを読んでいないので、(パイプを持たない)バッチファイルをぶら下げなくても実行できます。これはなぜでしょうか? –

+0

さまざまなオペレーティングシステム、異なるハードウェアなどで異なる動作をすることができます。出力の少ないスクリプトは、システムがオーバーフローしないので正常に動作します。この問題は、ストリームが完全な容量になるまでストリームを埋めて、プロセスがハングアップするときにのみ発生します。 配管については、それは非常に奇妙です。配管を使用しているスクリプトにはそれ以上の出力がありませんか? – RonK

+0

問題の根本は、Runtime.exec()がcmd.exeプロセスを作成しているということです。しかし、cmd.exeプロセスは、バッチファイルを実行するプロセスを作成します。 –

0

をするのに役立ちます。

+0

私は、この問題は、プロセスpが即座にバッチファイルを呼び出しているため、I/Oを持たないcmd.exeのインスタンスが作成されているということです。私はバッチファイルが新しいプロセスであると思うので、p.getOutputStream()とp.getInputStream()はバッチファイルの実行からI/Oを取得しません。 –

関連する問題