Muni Bus

パソコンの操作方法や設定方法を忘れないようにメモしています。ブログを一回引っ越ししているので、所々表示がかなり乱れています・・・

【コマンドプロンプト】for文でファイル名などがうまく展開されない

例えば、以下のようにfor文と変数を使用して、file1~file3という文字列を作成しようとすると、失敗する。

@echo off
set /a n=0
for /l %%n in (1, 1, 3) do (
set /a n=n+1
set filename=file%n%
echo %filename%
)

 

ECHO は <OFF> です。
ECHO は <OFF> です。
ECHO は <OFF> です。

これは、式の評価が(上記の例では)for文の括弧が最初に読み込まれた時点ですべて行われるため。プログラミン言語やスクリプト言語のように、順番に評価するためには、遅延環境変数の展開を有効にする必要がある。また、環境変数の指定に%記号ではなく!記号を使用する必要がある。

遅延環境変数の展開を有効にするには、「setlocal enabledelayedexpansion」とする。なお、setlocalコマンドはendlocalコマンドと対で行う必要があるものの、バッチファイルの終了時には「endlocal」が自動で実行されるため、特に明記しなくてもかまわない(setlocal /?を参照のこと)。

@echo off
setlocal enabledelayedexpansion
set /a n=0
for /l %%n in (1, 1, 3) do (
set /a n=n+1
set filename=file!n!
echo !filename!
)

 

file1
file2
file3