- - PR -
javaからのDOSコマンドの利用
1
投稿者 | 投稿内容 | ||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 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です。 よろしくお願い致します。 | ||||||||||||
|
投稿日時: 2006-10-18 20:09
setコマンドで環境変数に設定した「dateTmp」が
echoコマンドのときに無効になっているということでしょうか。。。 イメージとしては、普通にコマンドプロンプトを立ち上げて >set dateTmp=%date:~-10% >echo %dateTmp:~0,4%-%dateTmp:~5,2%-%dateTmp:~8,2% と続けざまに実行するのと同じなのですが javaからコマンドを発行すると、その度にコマンドプロンプトを立ち上げている というイメージになるのでしょうか。 | ||||||||||||
|
投稿日時: 2006-10-18 20:24
コマンドを発行、というか、個別にプロセスを起動しているので、 一回目と二回目は親プロセスが同じという共通点しかありません。 ところで、質問するためにあえて内容を変えているのでしょうか? 純粋に日付の書式化したいだけなのなら、 とてもじゃないですがまともな方法とは言えないので・・・。 | ||||||||||||
|
投稿日時: 2006-10-19 09:40
すみませんでした。 2つ目の投稿内容は無視してしまって下さい。 引き続き、1つ目の投稿内容が質問になります。 よろしくお願いします。 | ||||||||||||
|
投稿日時: 2006-10-19 10:03
まったくもってその通りです。 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
Javaソース
| ||||||||||||
|
投稿日時: 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 の両方を実行しなければなりません。 ただし、本質としては、現在日付の文字列が欲しいだけなのにコマンドプロンプトのコマンドを起動するという設計自体がおかしいように思いますが。 | ||||||||||||
|
投稿日時: 2006-10-19 17:30
やはり別プロセスになるのですね。
batファイルを呼び出す方法勉強になりました。 たしかに現在日付を取得するのならJavaのAPIでじゅうぶんなのに。 どしてこんな設計にしたんだか。。。 「現在日付の取得についてはDOSコマンドを利用して」とのことなので、 フォーマットに関してはjava側でやることにしました。 あしゅ さん、あすか さん、ひろ@ya さん ありがとうございました。 |
1