【Batch】forやifの中でsetを使う
2022-1-27 | Batch
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文字を超えてはならないので、あまり多くのファイルは処理できないので注意。
まとめ(感想文)
他のプログラムに引数で複数のファイルの名前を設定する場合なんかに使えるかもね!