【Batch】forやifの中でsetを使う

ネコニウム研究所

PCを利用したモノづくりに関連する情報や超個人的なナレッジを掲載するブログ

【Batch】forやifの中でsetを使う

2022-1-27 |

Batchでforやifの中でsetを使いたい!

概要

Batchでforやifの中で変数を使う時に他のプログラミング言語(C言語とか)の感覚でsetを使うと意図した動作にならない。
setlocal enabledelayedexpansionを使い、「遅延環境変数の展開」を有効にすることで他のプログラミング言語と同じような感覚でforやifの中で変数を操作することができる。
その例を示す。

仕様書

環境

  • Windows 10 Home Version 21H1(OS ビルド 19043.1415)

手順書

下記は、引数で渡されたファイルのフルパスを1行に並べて出力するサンプルです。引数がディレクトリなら中のファイルのフルパスを含める。

@echo off

setlocal enabledelayedexpansion

set args=

:loop

if "%~1" == "" goto end

set attr=%~a1

if exist %~1 (
    if %attr:~0,1%==d (
        for /r %~1 %%f in (*) do (
            set args=!args! "%%f"
        )
    ) else if %attr:~0,1%==- set args=!args! "%~1"
)

shift
goto loop

:end

echo !args!

endlocal

pause

解説

setlocal enabledelayedexpansionで「遅延環境変数の展開」を有効にする。

通常は変数を読み込む場合に%変数名%のように%で変数名を囲むが、「遅延環境変数の展開」を使うには!変数名!のように!で変数名を囲む。

Batchでは1行の合計長が8191文字を超えてはならないので、あまり多くのファイルは処理できないので注意。

まとめ(感想文)

他のプログラムに引数で複数のファイルの名前を設定する場合なんかに使えるかもね!