web-dev-qa-db-ja.com

DOSスクリプトで現在の日付と時刻を印刷する

ログに日付と時刻の後に文字列を出力するスクリプトがあります。

echo %DATE%_%TIME% Processing %%f >> process.log

問題は、日付と時刻が常にスクリプトが開始された日付と時刻になることです。私はスクリプトを一晩実行しましたが、まだ同じ日付と時刻を持っています。文字列がログファイルに出力されるときに現在の日付と時刻を表示するようにそれらを更新する方法はありますか?

14
Rayne

%%fがあるという事実は、エコーコマンドがFORループにあることを示しています。 FORループ全体が一度に解析され、%DATE%が解析時に展開されます。コマンドは各反復で再解析されないため、各反復で同じ値を取得します。 FORステートメントが実行される前に存在していた値を取得します!

解決策は遅延拡張です。 setlocal enableDelayedExpansionをスクリプトの上部近くに配置します。次に、!DATE!_!TIME!の代わりに%DATE%_%TIME%を使用します。遅延展開とは、構文解析ではなく、ステートメントの実行時に展開することを意味します。 HELPシステムには適切な説明があります。コマンドプロンプトからHELP SETまたはSET /?と入力し、遅延展開を扱うセクションを探します。

34
dbenham