if や for の中の実行コマンドは、一行とみなされているため、
これらのコマンドの実行開始時には%で囲まれた環境変数は展開済みとなりますが、
複雑なコマンドを書くときに、都合の悪いことが多々あります。
カレントディレクトリ内のファイル名を ; で区切って環境変数に設定する
filelist.cmd
@echo off
set FILELIST=
for %%i in (*) do set FILELIST=%FILELIST%%%i;
echo %FILELIST%
上記のバッチファイルは失敗します。for 文における %FILELIST% の展開が、
for文を開始するときに行われるために、最後のファイル名しか追加されません。
結果
C:\>filelist
ntuser.dat;
これを回避するために ! で囲んだ遅延環境変数の展開を使います。
! で囲まれた環境変数は、使われる直前で展開が行われます。
また、遅延環境変数機能を使うには、
・cmd /V:ON
・regをいじる
・setlocal ENABLEDELAYEDEXPANSION
の方法がありますが、最後の方法を使います。
これを使ってうまくいくバッチファイルは、
filelist.cmd
@echo off
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
set FILELIST=
for %%i in (*) do set FILELIST=!FILELIST!%%i;
echo %FILELIST%
結果
C:\>filelist
autoexec.bat;BOOTSECT.BAK;cmdmemo.txt;config.sys;ntuser.dat;
あまり使い分けが面倒なので、これ以降基本的には遅延変数展開を使用します。
|