- ベストアンサー
バッチファイルの%TIME%表示の謎
- バッチファイルで、1行でコマンドを連結した場合の%TIME%の値の不一致に関する問題を解説。
- コマンドの実行結果が期待と異なることから、原因や対策についてのアドバイスを求める内容。
- 特定の状況下で%TIME%が常に同じ値を返す理由とそれを解決する方法について考察。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
%の展開は、1行全体まとめて行なわれます。 「( 」で複数行にまたがっていれば全部まとめて。 その後に実行します。 ( Cをご存じなら#defineによるマクロみたいな物と思えば良いです) 通常のプログラミング言語の変数と同じように使いたければ、遅延環境変数を有効にして「%」でなく「!」を使います。 CLS & ECHO 開始時刻:!TIME! & TIMEOUT /t 2 & ECHO. & ECHO 終了時刻:!TIME! 有効にする方法1: setlocal enabledelayedexpansionをそれより前に書く。setlocalが有効になるので、環境変数の変更やcdの結果が外側に反映しない事になります。 有効にする方法2: cmd /v /c aaaaaa.bat で起動する。これは新規に起動したcmdの環境で実行されるので、方法1と同じように環境変数の変更やcdの結果が呼び出し元のcmdの環境には反映しません。 Explorereからダブルクリックで起動しているようなケースであれば上記の制約が問題ないので setlocal enabledelayedexpansion して ! で展開すればいいし、 コマンドプロンプトから、スクリプトファイル名を打ち込んで実行していたり、他のバッチスクリプトからcallで呼び出しているなどで、上記の制約が都合悪ければおとなしく行を分けて%で書くか、下記のアンドキュメンテッドな方法を使うか。 別案: その時点で変数を展開して欲しい命令に callを付けて% を二重にします(forやif等には使えません)。 ECHO 開始時刻:%TIME% & TIMEOUT /t 2 & ECHO. & call ECHO 終了時刻:%%TIME%%
その他の回答 (3)
- Uncle_John
- ベストアンサー率57% (454/790)
バッチファイルはインタープリタ系プログラム、コンパイラ系プログラムと異なります。 一行、読み込みその度に機械語に変換し処理します。処理後、次の行に移ります、 よって同じ行の時間は同じになります。 二行にするしか方法はありません。
お礼
- chie65536(@chie65535)
- ベストアンサー率44% (8740/19838)
バッチコマンドの環境変数は、コマンド行が処理開始された瞬間に、環境変数を実際の値に展開します。 全コマンドを1行で記述した場合は、最初に、その行の中の環境変数すべてが一気に全部展開されてから、実際の処理を開始します。 %TIME%をどこにいくつ書いても、すべて「ENTERキーを押した瞬間の時間」に展開されます。 CLS & ECHO 開始時刻:%TIME% & TIMEOUT /t 2 & ECHO. & ECHO 終了時刻:%TIME% と打ってENTERキーを押すと、押した瞬間にコマンドは CLS & ECHO 開始時刻:17:35:58.34 & TIMEOUT /t 2 & ECHO. & ECHO 終了時刻:17:35:58.34 に書き直され、書き直されてから処理が開始されるのです。 この展開処理(書き直し処理)は「行ごとに行う」ので、行を分割して、バッチファイルにして実行すれば、期待通りの結果になります。
お礼