- PR -

javaからのDOSコマンドの利用

1
投稿者投稿内容
Orphan
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 54
投稿日時: 2006-10-18 18:48
public static void main(String[] args) throws IOException {
String[] cmdarray1 = {"cmd.exe", "/c", "set dateTmp=%date:~-10%"};
Process process = Runtime.getRuntime().exec(cmdarray1);

String[] cmdarray2 = {"cmd.exe", "/c", "echo %dateTmp:~0,4%-%dateTmp:~5,2%-%dateTmp:~8,2%"};
process = Runtime.getRuntime().exec(cmdarray2);

InputStream is = process.getInputStream();
BufferedReader br = new BufferedReader(new InputStreamReader(is));

System.out.println("フォーマットされた日付:"+br.readLine());
}

javaからDOSコマンドを利用し、日付をフォーマットして使用したいのですが
上記を実行すると
"フォーマットされた日付:%dateTmp:~0,4%-%dateTmp:~5,2%-%dateTmp:~8,2%"
と表示されてしまいます。

どこか不備はありますでしょうか。

OSはXPです。

よろしくお願い致します。
Orphan
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 54
投稿日時: 2006-10-18 20:09
setコマンドで環境変数に設定した「dateTmp」が
echoコマンドのときに無効になっているということでしょうか。。。

イメージとしては、普通にコマンドプロンプトを立ち上げて
>set dateTmp=%date:~-10%
>echo %dateTmp:~0,4%-%dateTmp:~5,2%-%dateTmp:~8,2%
と続けざまに実行するのと同じなのですが
javaからコマンドを発行すると、その度にコマンドプロンプトを立ち上げている
というイメージになるのでしょうか。
あしゅ
ぬし
会議室デビュー日: 2005/08/05
投稿数: 613
投稿日時: 2006-10-18 20:24
引用:

Orphanさんの書き込み (2006-10-18 20:09) より:
javaからコマンドを発行すると、その度にコマンドプロンプトを立ち上げている
というイメージになるのでしょうか。



コマンドを発行、というか、個別にプロセスを起動しているので、
一回目と二回目は親プロセスが同じという共通点しかありません。

ところで、質問するためにあえて内容を変えているのでしょうか?

純粋に日付の書式化したいだけなのなら、
とてもじゃないですがまともな方法とは言えないので・・・。
Orphan
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 54
投稿日時: 2006-10-19 09:40
引用:

あしゅさんの書き込み (2006-10-18 20:24) より:

ところで、質問するためにあえて内容を変えているのでしょうか?



すみませんでした。
2つ目の投稿内容は無視してしまって下さい。
引き続き、1つ目の投稿内容が質問になります。

よろしくお願いします。
あすか
ぬし
会議室デビュー日: 2006/07/12
投稿数: 309
投稿日時: 2006-10-19 10:03
引用:

javaからコマンドを発行すると、その度にコマンドプロンプトを立ち上げている
というイメージになるのでしょうか。


まったくもってその通りです。
APIドキュメントにも
http://java.sun.com/j2se/1.4/ja/docs/ja/api/java/lang/Runtime.html
「in a separate process。」と書かれていますね。

日付を取得するだけならこんな回りくどいことをしなくても
JavaのAPIだけで十分だと思いますが。

一応今回のサンプルをどうしてもRuntime.execで実行したい場合は
外部のbatファイルを作成し
そこにコマンドを記述し
そのbatファイルを実行すれば問題なく値を取得できます。

外部バッチD:\batch\sample.bat
コード:
@echo off
set dateTmp=%date:~-10%
echo %dateTmp:~0,4%-%dateTmp:~5,2%-%dateTmp:~8,2%


Javaソース
コード:
public static final void main (String [] args) {
  Process process = Runtime.getRuntime().exec(
    new String[]{"cmd.exe", "/c", "D:\\batch\\sample.bat"}); 
  InputStream is = process.getInputStream(); 
  BufferedReader br = new BufferedReader(new InputStreamReader(is)); 
  System.out.println("フォーマットされた日付:"+br.readLine()); 
}

ひろ@ya
大ベテラン
会議室デビュー日: 2006/02/23
投稿数: 168
投稿日時: 2006-10-19 10:14
まず、環境変数がシステムのグローバル変数ではなく、プロセス毎に管理されていることを理解しましょう。

cmd.exeでsetを呼んだ場合に変わるのは cmd.exe自身のプロセスの環境変数だけで親の java側の環境変数は変わらないので、

・cmd.exe起動
・setでcmd.exeの環境変数設定
・cmd.exe終了(この時点でsetした環境変数の内容は消滅する)
・別のプロセスとして改めてcmd.exe起動
・echo 実行

という流れになります。
setの環境変数設定をechoに反映するには、1度のcmd.exeの起動で、set と echo の両方を実行しなければなりません。

ただし、本質としては、現在日付の文字列が欲しいだけなのにコマンドプロンプトのコマンドを起動するという設計自体がおかしいように思いますが。
Orphan
ベテラン
会議室デビュー日: 2004/02/06
投稿数: 54
投稿日時: 2006-10-19 17:30
やはり別プロセスになるのですね。

batファイルを呼び出す方法勉強になりました。

たしかに現在日付を取得するのならJavaのAPIでじゅうぶんなのに。
どしてこんな設計にしたんだか。。。

「現在日付の取得についてはDOSコマンドを利用して」とのことなので、
フォーマットに関してはjava側でやることにしました。

あしゅ さん、あすか さん、ひろ@ya さん
ありがとうございました。
1

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