@echooffsetlocalenabledelayedexpansion:: 3行2列の表(行=ROW, 列=COL)setM[0][0]=田中 & setM[0][1]=営業
setM[1][0]=佐藤 & setM[1][1]=開発
setM[2][0]=鈴木 & setM[2][1]=総務
setROWS=3
:: 全行を出力set /a LAST_ROW=%ROWS%-1
for /l %%r in (0,1,%LAST_ROW%) do (
echo 氏名: !M[%%r][0]! 部署: !M[%%r][1]!
)
endlocal
実務パターン集
パターン1: ファイルリストを配列に格納して処理する
file-list.bat
@echooffsetlocalenabledelayedexpansion:: 処理対象ファイルを配列に格納setN=0
for %%f in (C:data*.csv) do (
setFILE[!N!]=%%f
set /a N+=1
)
echo 対象ファイル数: %N%set /a LAST=%N%-1
for /l %%i in (0,1,%LAST%) do (
echo 処理中: !FILE[%%i]!:: ここで各ファイルへの処理を実行:: xcopy "!FILE[%%i]!" D:ackup /Y
)
endlocal
パターン2: CSVの1行を配列に分割してパースする
csv-parse.bat
@echooffsetlocalenabledelayedexpansion:: CSV行を配列に分割setLINE=山田太郎,35,東京,営業部
setCOL_IDX=0
for /f "tokens=1-4 delims=," %%a in ("!LINE!") do (
setCOL[0]=%%a
setCOL[1]=%%b
setCOL[2]=%%c
setCOL[3]=%%d
)
echo 氏名: !COL[0]!echo 年齢: !COL[1]!echo 地域: !COL[2]!echo 部署: !COL[3]!endlocal
パターン3: ホワイトリスト照合(配列で許可リストを管理)
whitelist.bat
@echooffsetlocalenabledelayedexpansion:: 許可する拡張子リストsetWL[0]=.csv & setWL[1]=.txt & setWL[2]=.log
setWL_LEN=3
setINPUT_EXT=.csv
setALLOWED=0
set /a WL_LAST=%WL_LEN%-1
for /l %%i in (0,1,%WL_LAST%) do (
if /i "!WL[%%i]!"=="!INPUT_EXT!"setALLOWED=1
)
if%ALLOWED%==1 (
echo%INPUT_EXT% は許可された拡張子です
) else (
echo%INPUT_EXT% は許可されていません
)
endlocal
for /l %%i in (0,1,%LEN%) は使えます(パース時に展開される)。ただし (0,1,!LEN!)(遅延展開)は構文エラーになるため使えません。set /a LAST=%LEN%-1 で計算した変数を使ってください。
❓ 配列の要素数が動的に決まる場合の対処法 クリックで開閉
格納時にカウンタ変数をインクリメントし、ループ後に set LEN=%IDX% でコピーして保持します。for /l の上限は %LEN%(パース時展開)で問題なく動作します。
よくある質問(FAQ)
Q. バッチファイルでは本当の配列は使えないのですか?
A. バッチファイルには組み込みの配列型はありません。代わりに変数名にインデックスを含めた「疑似配列」を使います:set arr[0]=apple・set arr[1]=banana。FORループでfor /L %%i in (0,1,2) do echo !arr[%%i]!のようにアクセスします(DELAYEDEXPANSION必須)。
Q. バッチファイルでスペース区切りの値をFORで処理するのと疑似配列はどちらがよいですか?
A. 少数の値をシンプルに処理するならfor %%i in (apple banana cherry) doのスペース区切りリストが手軽です。インデックスアクセス・要素の追加削除・カウントが必要な場合は疑似配列が適しています。ファイル行ごとの処理にはFOR /Fが向いています。
Q. 配列の要素数(カウント)を取得するにはどうすればよいですか?
A. カウント用の変数を自前で管理します:set count=0し、要素追加ごとにset /a count+=1でインクリメント。または全要素をループして数える:set count=0 & for /L %%i in (0,1,100) do if defined arr[%%i] set /a count+=1。定義されていない変数はif definedでfalseになります。