「バッチファイル」タグアーカイブ

バッチ処理での変数トラブル解消!EnableDelayedExpansionでリアルタイム展開を実現する方法

Windowsのバッチファイル(.bat/.cmd)で FORIF を使った処理を記述していると、
「変数が更新されない」「値がループ中で変わらない」といった問題に直面することはありませんか?

その原因は、変数が「実行前に展開される」ためです。
この問題を解消するための鍵となるのが、**setlocal EnableDelayedExpansion(遅延環境変数展開)**です。

この記事では、初心者でも理解できるように「なぜ必要なのか」「どう使うのか」を実例付きで丁寧に解説します。


✅ 通常の変数展開とその問題点

バッチファイルでは、変数は通常 %変数名% の形式で展開されます。
しかし %変数名%FORループ開始前に固定されるため、ループ内で更新しても反映されません。

❌ 例:変数が更新されていないケース(失敗例)

🔍 この場合、出力は以下の通りになります。

0
0
0

→ ループの中でカウントを増やしているのに、%cnt% は常に最初の「0」のままです。


✅ 解決策:EnableDelayedExpansionを使って遅延展開する

変数を**実行時に展開する方式(遅延展開)**に切り替えることで、この問題を解消できます。

そのために必要なのが、以下の1行です:

さらに、変数の表記を %変数名% から !変数名! に変更します。


✅ 正しい例:遅延展開を使った成功例

📌 出力結果:

1
2
3

!cnt! を使うことで、ループごとに最新の値が展開されるようになります。


✅ なぜ「!」に変える必要があるのか?

展開方法展開タイミング書き方主な用途
通常展開コマンド実行前%変数名%単純な処理
遅延展開実行中(リアルタイム)!変数名!FOR/IF などのループ内

✅ 応用例:文字列置換との組み合わせ

以下のような「文字列の一部を動的に置換する」ケースでも遅延展開が役立ちます。


✅ EnableDelayedExpansionが2回登場することがある理由

バッチファイル内で call されたサブルーチンやネスト構造がある場合、setlocal/endlocal のスコープが階層ごとに分かれるため、そのたびに再設定するケースがあります。


✅ まとめ

項目内容
何のための機能?変数をリアルタイムで展開するため
必要な記述setlocal EnableDelayedExpansion
書き換える箇所%変数名% → !変数名!
主な利用シーンFOR/IFループ内で変数が更新される処理
書き忘れると…値が変わらず意図しない結果になる

✅ 次のステップ:あなたのバッチにも適用してみよう!

もし今お使いのバッチで「ループ中に値が変わらない」「文字列置換が動かない」といった問題がある場合、ぜひ EnableDelayedExpansion を追加してみてください。

Windowsバッチで西暦8桁・月日2桁のゼロ埋め日付を出力する方法

バッチ処理を作成するときに、ログファイル名やバックアップファイル名に日付を付与するケースはよくあります。その際「20250913」のように 西暦8桁(YYYYMMDD形式) でゼロ埋めされた日付を出力したいことがあります。
この記事では、Windowsバッチでゼロ埋めした日付を取得する方法を紹介します。


基本的な考え方

Windowsバッチでは %date% 変数を使うことで、現在の日付を取得できます。ただし環境によって表示形式が異なり、例えば以下のようになります。

  • 日本語ロケール(Windows 10/11 既定)

    2025/09/13
  • 英語ロケール

    Sat 09/13/2025

このため、文字列の位置を指定して切り出す必要があります。


実用例:西暦8桁+月日2桁のゼロ埋め

以下のバッチスクリプトでは、YYYYMMDD 形式で日付を取得します。

実行結果(2025年9月13日の場合)

20250913

応用:時刻と組み合わせて使う

ファイル名などで「日付+時刻」を付けたい場合は、%time% も組み合わせられます。

実行例

20250913_083015

ロケールに依存しない方法

環境によって %date% のフォーマットが変わるとバッチが動作しなくなることがあります。
その場合、wmic を使うとロケール非依存で日付を取得できます。

実行結果

20250913

まとめ

  • %date% を切り出す方法は簡単だがロケール依存。

  • 確実性を求めるなら wmic を使うのがおすすめ。

  • 日付はログやバックアップのファイル名に利用すると便利。

バッチで日付をゼロ埋めして扱うと、ファイルの並び順も自然になり管理がしやすくなります。
ぜひ日常の運用バッチに取り入れてみてください。