- PR -

Javaの Process exec(String command)について(cmd /c の制限?)

1
投稿者投稿内容
ボブ
常連さん
会議室デビュー日: 2007/10/03
投稿数: 44
投稿日時: 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
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-07-03 16:39
http://javafaq.jp/S103.html#S103-07
のように配列を引数にする exec メソッドを使うと良いです。
ボブ
常連さん
会議室デビュー日: 2007/10/03
投稿数: 44
投稿日時: 2008-07-03 16:44
引用:

unibonさんの書き込み (2008-07-03 16:39) より:
http://javafaq.jp/S103.html#S103-07
のように配列を引数にする exec メソッドを使うと良いです。



ありがとうございます。
配列を使っても
cmd /c を使うと駄目なようです。
cmd /c を使わなければOK
mio
ぬし
会議室デビュー日: 2005/08/25
投稿数: 734
お住まい・勤務地: 神奈川県
投稿日時: 2008-07-03 17:03
exec(String)→StringTokenizerで分割し、配列用のexec()へ。

exec(String[])→ProcessImplで空白またはタブが含まれるものをクォーティングし、連結して実行

どちらにしろ同じことになりそうな。

\\\"でくくるとか…?
unibon
ぬし
会議室デビュー日: 2002/08/22
投稿数: 1532
お住まい・勤務地: 美人谷        良回答(20pt)
投稿日時: 2008-07-03 17:10
引用:

ボブさんの書き込み (2008-07-03 16:44) より:
配列を使っても
cmd /c を使うと駄目なようです。
cmd /c を使わなければOK


問題点を理解できました。そういうことでしたか。

話を戻すのですが cmd /c は使う必要があるのでしょうか?後述のようなバッチファイルではなく .exe のプログラムの場合、なら cmd /c を使わなければうまくいくと思いますが、使わないといけないのでしょうか?

引用:

ボブさんの書き込み (2008-07-03 16:25) より:
cmd /c "C:\aaa\aaa.bat" aaa  →OK
cmd /c C:\aaa\aaa.bat "aaa" →OK
cmd /c "C:\aaa\aaa.bat" "aaa" →NG


と書かれているということは Windows のバッチプログラムを動かす必要があるということでしょうか?
ボブ
常連さん
会議室デビュー日: 2007/10/03
投稿数: 44
投稿日時: 2008-07-03 17:35
引用:

unibonさんの書き込み (2008-07-03 17:10) より:

問題点を理解できました。そういうことでしたか。

話を戻すのですが cmd /c は使う必要があるのでしょうか?後述のようなバッチファイルではなく .exe のプログラムの場合、なら cmd /c を使わなければうまくいくと思いますが、使わないといけないのでしょうか?



そうですね、汎用的なプログラムですので、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
となるので、解決しようがないのかなと思いはじめてしまいました。
rain
ぬし
会議室デビュー日: 2006/10/19
投稿数: 549
投稿日時: 2008-07-03 17:58
コード:

cmd /c ""C:\aaa\aaa.bat" "aaa""


ただし、上の例ですとバッチファイルには "aaa" とダブルクォート付きで渡されます。
これが嫌であれば、バッチファイル側での受け取り方を %1 から %~1 へ変える必要があります。


[ メッセージ編集済み 編集者: rain 編集日時 2008-07-03 18:00 ]
ボブ
常連さん
会議室デビュー日: 2007/10/03
投稿数: 44
投稿日時: 2008-07-03 22:30
引用:

rainさんの書き込み (2008-07-03 17:58) より:
コード:
cmd /c ""C:aaaaaa.bat" "aaa""


ただし、上の例ですとバッチファイルには "aaa" とダブルクォート付きで渡されます。
これが嫌であれば、バッチファイル側での受け取り方を %1 から %~1 へ変える必要があります。


[ メッセージ編集済み 編集者: rain 編集日時 2008-07-03 18:00 ]


ありがとうございます。
この方法で出来ました。
1

スキルアップ/キャリアアップ(JOB@IT)