dポイントプレゼントキャンペーン実施中!

バッチファイル DOS Windows2000環境での日付取得

いつもお世話になります。

Windows2000環境にて当日日付を取得する下記のバッチファイルがあります。

~コード開始~
REM 日付取得
FOR /F "tokens=1 delims= " %%i in ('DATE /t') do SET TEST1=%%i
ECHO %TEST1%
~コード終了~

上記プログラム結果は【YYYY/MM/DD】となります。
※YYYY:当年 MM:当月 DD:当日

上記コードはWindows2000環境のDOSプロンプトにて【DATE /t】コマンドを実行すると
【YYYY/MM/DD 曜日】が表示されるのを利用しております。
結果的にスペース区切りで1節目の【YYYY/MM/DD】だけを抜き取っております。
これは問題ありませんでした。

しかし、下記コードで実行した所、意図した結果と異なるものになりました。

~コード開始~
REM 日付取得
FOR /F "tokens=2 delims= " %%i in ('ECHO %DATE%') do SET TEST1=%%i
ECHO %TEST1%
~コード終了~

上記プログラム結果は【YYYY/MM/】となってしまい、【DD】が抜けておりました。
※YYYY:当年 MM:当月 DD:当日

上記コードはWindows2000環境のDOSプロンプトにて【DATE】コマンドを実行すると
【曜日 YYYY/MM/DD】が表示されるのを利用しております。
結果的にスペース区切りで2節目の【YYYY/MM/DD】だけを抜き取る予定でしたが
見ての通り予想外の結果です。

この現象はなぜでしょうか?
何が起因して【DD】が表示されないのでしょうか?
他に当日日付の取得方法はいくつか知っていますが、
上記プログラムで取得したいのです。

どなたかご存知の方がいらっしゃればご教授願いませんでしょうか?

以上、何卒宜しくお願い致します。

A 回答 (4件)

No.3です。

Windows2000のfor /Fということで直感的に日本語のバグを思い出したので確認なしに回答しましたが、おっしゃるとおり漢字は1文字なのでおかしいですね。
改めてvmware上のWindows2000 serverで確認しましたが、やはり YYYY/MM/D と一文字だけかける結果となり、こちらの環境では YYYY/MM にはなりませんでした。ご参考まで。
    • good
    • 0

Windows2000のfor文にはバグがあり、in( )の中で全角文字を使うと文字数分後ろが削られます。


以下のリンク先を参照してください。

http://fpcu.on.coocan.jp/dosvcmd/bbs/log/cat3/fo …
http://fpcu.on.coocan.jp/dosvcmd/bbs/log/cat3/fo …

for 文が実行される時点で、echo %DATE% の%DATE%部分が展開されて実行されるため、
そこに含まれる曜日の全角文字が上記バグに引っかかるわけです。

%DATE%を環境変数TEST1に代入するのですから、バグのあるfor文を使わずに

set TEST1=%DATE:~-10%

などほかの方法で書くしかないでしょう。

参考URL:http://fpcu.on.coocan.jp/dosvcmd/bbs/log/cat3/fo …

この回答への補足

ご回答ありがとうございます。

ただ、ご提示の情報に基づくと納得がいかない1点あります。

それは、全角文字である曜日の1文字がバグに引っかかるのであれば
削除されるのは【D】の1文字だけのはずです。

なぜ【DD】と1文字ではなく2文字削除されるのでしょうか?

もしかして【D】1文字は半角だから、【全角1文字=半角2文字】と
いう感じで削除されているのでしょうか?

そうであれば確かに納得です。

補足日時:2010/09/20 08:49
    • good
    • 0

こちらで試したところ、次のようになりました。



Win7Home64bit:
2010/09/19

Win2000ProSP4(VirtualPC2007):


となり、7では意図通りだが2000はまた違う現象で、次の修正をかけるとうまくいきました。(2案あります)

1)FOR /F "tokens=3 delims= " %%i in ('ECHO %DATE%') do SET TEST1=%%i
2)FOR /F "tokens=3" %%i in ('ECHO %DATE%') do SET TEST1=%%i

もしECHO %DATE%の実行結果が初めからそうなっていたら、これはどうにもなりませんけど。そうでなければ2)の、delimsパラメータの削除で何とかなりませんかね?こちらでのECHO %DATE%の実行結果はなぜか、日 2010/09/19となります(頭に「日 」がつく)。
    • good
    • 0

後半の質問文が矛盾してます。



>~コード開始~
>REM 日付取得
>FOR /F "tokens=2 delims= " %%i in ('ECHO %DATE%') do SET TEST1=%%i
>ECHO %TEST1%
>~コード終了~

コードはECHO %DATE%と書いてありますが、その下には、

>上記コードはWindows2000環境のDOSプロンプトにて【DATE】コマンドを実行すると
>【曜日 YYYY/MM/DD】が表示されるのを利用しております。

「DATEコマンドを実行」と書いてあります。どちらが正しいのでしょう?

コードの方が正しいとすると、tokens=2でのfor文を書くと、ECHO %DATE% は1トークンしかないので、その出力結果はスキップされます。つまり
>FOR /F "tokens=2 delims= " %%i in ('ECHO %DATE%') do SET TEST1=%%i
の、SET TEST1=%%i は一度も実行されないので、TEST1の値はその前のままです。上記FOR/Fの実行前の時点で、TEST1はYYYY/MMであったはずで、そのまま表示されたと言うことです。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!