mattintosh note

どこかのエンジニアモドキの備忘録

コマンドプロンプトの for 内で変数宣言

ちょっと Windows でバッチを書く用事があったので for を使ってたんだけどなんかおかしい。

for /f delims^= %%i in (foo.txt) do (
  set foo=%%i
  @echo %foo%
)

こうすると何故か最終行をひたすら出力する。set はきちんと行われているはずなのに…?

色々調べてみると setlocal enabledelayedexpansion(遅延環境変数展開)を設定しないとローカル変数が使えないらしい。

setlocal enabledelayedexpansion
for /f delims^= %%i in (foo.txt) do (
  set foo=%%i
  @echo !foo!
)
setlocal disabledelayedexpansion

しかも cmd.exe で実行する場合は %i でいいのにバッチファイルにすると %%i にしなくちゃいけないとか何この仕様...orz