• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:バッチを1行記述した時の %TIME% について)

バッチファイルの%TIME%表示の謎

このQ&Aのポイント
  • バッチファイルで、1行でコマンドを連結した場合の%TIME%の値の不一致に関する問題を解説。
  • コマンドの実行結果が期待と異なることから、原因や対策についてのアドバイスを求める内容。
  • 特定の状況下で%TIME%が常に同じ値を返す理由とそれを解決する方法について考察。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

%の展開は、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%%

HIROKW
質問者

お礼

! を使ってみましたが、 そのまま ! が表示されてしまいました…

Powered by GRATICA

その他の回答 (3)

回答No.4

バッチファイルはインタープリタ系プログラム、コンパイラ系プログラムと異なります。 一行、読み込みその度に機械語に変換し処理します。処理後、次の行に移ります、 よって同じ行の時間は同じになります。 二行にするしか方法はありません。

HIROKW
質問者

お礼

ありがとうございます。 2行にしたら、確かに同じ時間にはなりませんでした。 しかし、当初の1行打って…は達成できないみたいですね。

Powered by GRATICA
回答No.3

バッチコマンドの環境変数は、コマンド行が処理開始された瞬間に、環境変数を実際の値に展開します。 全コマンドを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 に書き直され、書き直されてから処理が開始されるのです。 この展開処理(書き直し処理)は「行ごとに行う」ので、行を分割して、バッチファイルにして実行すれば、期待通りの結果になります。

HIROKW
質問者

お礼

> すべて「ENTERキーを押した瞬間の時間」に展開 なるほど、これが原因ですね。 理解できました。

Powered by GRATICA
  • f272
  • ベストアンサー率46% (8467/18126)
回答No.1

setlocal EnableDelayedExpansion で遅延環境変数展開を有効にして %TIME% の代わりに !TIME! を使ってください。

HIROKW
質問者

お礼

!TIME! と そのままの文字で表示されてしまいました。

Powered by GRATICA

関連するQ&A