Batファイル作成でFor文中でif文の条件分岐を行おうとしたときの備忘録です
For文で繰り返し処理を行う必要があったのですが、For文内で代入した値が更新されませんでした。
コマンドプロントでは、if/forなどのブロックを実行する際、ブロック実行前にブロックの読み取り、変数を値に展開、実行という順番で実行されるためこのような現象が起きます。
調べたところ環境遅延変数を使用するよいとのことでした。
遅延環境変数は名前の通り変数から値への展開が遅れて実行される変数のことです。
例えばFor文の中で条件によってCopy先を変更する場合、以下のように記述すると'dest'に正しく値が代入されず、Desktopに移動してしまいます。
Error.bat
@echo off
Set org="Org"
Set dest=
cd C:\Users\XXXXX\Desktop\%org%
for %%a in (*) do (
if exist ..\Dest1 (
set dest="Dest1"
) else (
set dest="Dest2"
)
move %%a ..\%dest%
)
遅延環境変数を使用する場合はfor/ifブロック内部で変数読み取り時に!dest!
のように記述し、ファイル先頭にSetlocal enabledelayedexpansion
を追記します。変数読み取り時に代入した値が反映され、目的のフォルダにファイルを移動させることができました。
modified.bat
@echo off
setlocal enabledelayedexpansion
rem File Copy
Set org=Org
cd C:\Users\XXXXX\Desktop\%org%
for %%a in (*) do (
Set dest=
if exist ..\Dest1 (
set dest="Dest1"
) else (
set dest="Dest2"
)
move %%a ..\!dest!
)
Result
1 個のファイルを移動しました。
1 個のファイルを移動しました。
1 個のファイルを移動しました。
1 個のファイルを移動しました。