FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

javaで外部コマンド呼出し(exec)したときの戻り値が意図しない値になった

 javaでバッチファイルを通してjavaのコマンドを実行し、その戻り値をwaitFor()で取得という処理を作成していたのだが、戻り値が意図したとおりにならないことがあった。

 そのときのプログラムは下記のような感じ
 (もちろん、大幅に簡略化してある)

■呼び出し側
public class ExitValueTest {
  public static void main(String[] args) throws Exception{

    //コマンド
    String[] argList = {"D:\\test\\" + args[0]};

    //コマンド実行
    Runtime run = Runtime.getRuntime();
    Process pro = run.exec(argList);

    //終了待ち
    int ret = pro.waitFor();

    //結果表示
    System.out.println(ret);
  }
}

■呼び出されるバッチファイル(aaa.bat)
@echo off

java test.ExitValueTestChild 1

echo on

■バッチから呼び出されるJavaプログラム
public class ExitValueTestChild {
  public static void main(String[] args){
    System.exit(Integer.parseInt(args[0]));
  }
}


これで、 java test.ExitValueTest aaa.bat と実行すると、「1」が返却されると思っていた。
しかし、実際には0が返却される。

以下のようにバッチをコマンドプロンプトから読んでみると、errorlevelにはちゃんと「1」が入っている。
>>aaa.bat
>>echo %errorlevel%
1

かなり悩んだのだが、原因は 「echo on」にあった。
javaのwaitFor()、exitValue()で取得できる値は、バッチファイルを実行した場合、そのバッチ内の最後のコマンドの戻り値となる。
対してerrorlevelはechoやgotoなどの戻り値はセットされないもよう。
(正式な仕様がわからなかったので推測だが)

よって、バッチ側の最終行を削除(javaコマンド以降に何も実行しないように)すると、JavaのwaitFor()で意図したとおりの値「1」が取得できた。

今回は最終行を削除するだけですんだが、処理を分岐させて、終わったらgotoで最後に飛ばすようにしている場合などはどうすればいいのだろう・・・。
スポンサーサイト

テーマ : プログラミング
ジャンル : コンピュータ

コメントの投稿

管理者にだけ表示を許可する

検索フォーム
プロフィール

takuan93

Author:takuan93
本ブログの説明書→「ReadMe」

管理者に連絡

カテゴリ
WiX (5)
Ant (1)
フリーエリア
最新記事
カウンター
カレンダー
09 | 2018/10 | 11
- 1 2 3 4 5 6
7 8 9 10 11 12 13
14 15 16 17 18 19 20
21 22 23 24 25 26 27
28 29 30 31 - - -
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。