- - PR -
Javaの Process exec(String command)について(cmd /c の制限?)
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2008-07-03 16:25
JDK:1.4.2_12
OS :XP SP2 Javaからあるプログラムに引数を渡して実行させようと思っています。 ソースのサンプルは下記にあるような一般的な方法です。 -------------------------------------------------------------- try { String command = cmd /c プログラムパス プログラムの引数 Runtime runtime = Runtime.getRuntime(); Process process = runtime.exec(command); // 結果を標準出力に書き出す Reader in = new InputStreamReader(process.getInputStream()); int exitCode = process.waitFor(); int c = -1; while ((c = in.read()) != -1) { System.out.print((char) c); } in.close(); } catch (Exception ex) { ex.printStackTrace(); } -------------------------------------------------------- ここでプログラムパスと、プログラム引数に空白がある場合、ダブルコートで 囲えばいいと推測しました。しかしプログラムパス 又は 引数のどちらか 片方だけにダブルコートを囲うときは正常に処理されるのですが、 両方にあると exitコードが 1で返ってきてしまいます。 解決する方法はないでしょうか? cmd /c "C:\\aaa\\aaa.bat" aaa →OK cmd /c C:\\aaa\\aaa.bat "aaa" →OK cmd /c "C:\\aaa\\aaa.bat" "aaa" →NG | ||||||||
|
投稿日時: 2008-07-03 16:39
http://javafaq.jp/S103.html#S103-07
のように配列を引数にする exec メソッドを使うと良いです。 | ||||||||
|
投稿日時: 2008-07-03 16:44
ありがとうございます。 配列を使っても cmd /c を使うと駄目なようです。 cmd /c を使わなければOK | ||||||||
|
投稿日時: 2008-07-03 17:03
exec(String)→StringTokenizerで分割し、配列用のexec()へ。
exec(String[])→ProcessImplで空白またはタブが含まれるものをクォーティングし、連結して実行 どちらにしろ同じことになりそうな。 \\\"でくくるとか…? | ||||||||
|
投稿日時: 2008-07-03 17:10
問題点を理解できました。そういうことでしたか。 話を戻すのですが cmd /c は使う必要があるのでしょうか?後述のようなバッチファイルではなく .exe のプログラムの場合、なら cmd /c を使わなければうまくいくと思いますが、使わないといけないのでしょうか?
と書かれているということは Windows のバッチプログラムを動かす必要があるということでしょうか? | ||||||||
|
投稿日時: 2008-07-03 17:35
そうですね、汎用的なプログラムですので、batが呼ばれる場合もありますし、xlsファイルが直接呼ばれる場合、notepadが呼ばれる場合などがあります。 Javaを使わずにコマンドプロンプトで、 cmd /c "C:\aaa\aaa.bat" aaa →OK cmd /c C:\aaa\aaa.bat "aaa" →OK cmd /c "C:\aaa\aaa.bat" "aaa" →NG となるので、解決しようがないのかなと思いはじめてしまいました。 | ||||||||
|
投稿日時: 2008-07-03 17:58
ただし、上の例ですとバッチファイルには "aaa" とダブルクォート付きで渡されます。 これが嫌であれば、バッチファイル側での受け取り方を %1 から %~1 へ変える必要があります。 [ メッセージ編集済み 編集者: rain 編集日時 2008-07-03 18:00 ] | ||||||||
|
投稿日時: 2008-07-03 22:30
ありがとうございます。 この方法で出来ました。 |
1