- PR -

外部コマンドが実行されない

1
投稿者投稿内容
ゆう
常連さん
会議室デビュー日: 2001/12/10
投稿数: 33
投稿日時: 2007-03-08 01:24
いつもお世話になっています。

外部コマンド(batファイル)を実行するテストを行っていたのですが、
エラーも何も出力されず、終了コードは返されます。
原因を調べていて以下のコードを試しましたが、
やはりエラーは出力されず、
終了コードは返されます。

実際にはdirコマンドの結果を出力することを期待しているのですが、何も出力されません。
これはエラーが起こっているわけではないのでしょうか?
dirコマンドの結果が返されない理由は何でしょうか?

public class TestRuntime {

public static void main(String[] args) {
try {
// プロセスオブジェクトを生成
String[] cmdarray = {"command.com", "/c", "dir"};
Process process = Runtime.getRuntime().exec(cmdarray);
// 外部コマンドの標準出力を取得するための入力ストリームを取得
InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is);
// 標準出力を1行づつ取り出します
String line;
while ((line = br.readLine()) != null) {
System.out.println(line);
}
System.out.println(process.exitValue());

} catch (Exception e) {
e.printStackTrace();
}
}
}

環境
Jdk:1.4.2_12
OS:WindowsXP
山本 裕介
ぬし
会議室デビュー日: 2003/05/22
投稿数: 2415
お住まい・勤務地: 恵比寿
投稿日時: 2007-03-08 02:10
br.readLine() はプロセスが終了するまで待ってくれる保証があるのでしょうか?
プロセスが終了していないのに出力がないから終了したと判断してしまっているのではないでしょうか。
ゆう
常連さん
会議室デビュー日: 2001/12/10
投稿数: 33
投稿日時: 2007-03-08 07:44
インギさん、回答ありがとうございます。
以下に関してですが、br.readLineを行って、Windowsの"dir"の結果を取得したいのですが、実行すると何も取得できないまま終了してしまうわけです。
エラーにならないので、なぜ実行結果が返ってこないかが分かりません。

ちなみに、コマンド実行の後に
process.waitFor();を入れてみても結果は変わりませんでした。

引用:

インギさんの書き込み (2007-03-08 02:10) より:
br.readLine() はプロセスが終了するまで待ってくれる保証があるのでしょうか?
プロセスが終了していないのに出力がないから終了したと判断してしまっているのではないでしょうか。

かつのり
ぬし
会議室デビュー日: 2004/03/18
投稿数: 2015
お住まい・勤務地: 札幌
投稿日時: 2007-03-08 09:04
dirの結果が欲しいなら、
new String[]{"cmd","/C","dir"}じゃないでしょうか。
やじゅう
常連さん
会議室デビュー日: 2005/08/10
投稿数: 34
お住まい・勤務地: 野獣の住処
投稿日時: 2007-03-08 14:09
br.readLine()した時には、dirが既に終わってしまっているのだと思います。
バッチファイルに

start /wait notepad
dir

とでも書いてこれをRuntime#exec()し、起動されるメモ帳を閉じてみるとどうでしょう。
だっちょ
大ベテラン
会議室デビュー日: 2006/12/05
投稿数: 115
投稿日時: 2007-03-08 14:47
 すでに回答されているので、補足ですが、
私の環境で実行すると16bitMSーDOSサブシステムというダイアログがでて、
アプリケーション環境の設定でエラーが発生しました。
と表示されます。command.com自体が動作しないで正常終了していると思われます。
 16bitアプリは単純には動作しないので、一度command.com /C dir
をコマンドで動かして、command.comが動作できる環境になってから問題のものを動作させるか、あるいはcommand.comをcmd.exeに変更するのだと思います。
1

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