0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Bat 繰り返し処理での遅延環境変数

Last updated at Posted at 2021-11-09

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 個のファイルを移動しました。
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?