
batファイルを使用しますが、forコマンドが上手くいきません
そのような悩みを持っている人も多いのではないでしょうか?
bat(バッチファイル)で繰り返しを行いたい場合は、おなじみ「for」を使用します。batのforは少し癖があるので、馴染みにくいかと思います。
この記事を最後まで読めばbatファイルでforを使用し、繰り返しの処理を行う事が出来ます。それによって業務効率化の幅が広がります。
batでforを使用して繰り返す方法を画像などを織り交ぜ、具体的に見ていきましょう。
batでforの使い方!基本構文
bat(バッチファイル) でforを使用する時の、基本の形は下記です。
for オプション %%変数1文字 in (対象) do コマンド
コマンドを複数指定したい場合は下記でもOK ※ここでは変数を「i」としています。
for オプション %%i in (対象) do (
コマンド1
コマンド2
コマンド3
)
基本の形なので、覚えておきましょう。


batでforを使用するオプション4つ
batでループするにはforがあり、そのオプションは4つあります。
デフォルト(オプション無し)はカレントディレクトリの「ファイル」とする。
- /d ・・・対象をカレントディレクトリの「ディレクトリ」のみとする。
- /r ・・・対象をカレントディレクトリと、その配下のサブディレクトリの「ファイル」も含む。
- /l ・・・対象の値を決める
- /f ・・・対象をテキストファイル内にする


forフォルダにfor1.batファイルがあります。ここがカレントディレクトリになります。
sub_dirディレクトリとtext1.txtファイルからtext3.txtファイルがあります。
デフォルトのforパターン
bat(バッチファイル)に下記コマンドを書いて、保存後実行してください。
@echo off
for %%i in (*) do
echo %%i
pause


カレントディレクトリに存在する「ファイル」が、すべて表示されています。
オプション①-ディレクトリを対象とする
① /d ・・・カレントディレクトリの「ディレクトリ」を対象とする
デフォルトでは「ファイル」でしたが、カレントディレクトリにある「ディレクトリ」を対象にしたい場合には「/d」を使用します。
bat(バッチファイル)に「/d」のオプションを追記し、保存後実行してください。
@echo off
for /d %%i in (*) do
echo %%i
pause


カレントディレクトリに存在する「ディレクトリ」が、すべて表示されています。
オプション②- ディレクトリ配下すべてのファイルを対象とする
②/r ・・・カレントディレクトリ配下のすべての「ファイル」を対象とする
デフォルトではカレントディレクトリのみの「ファイル」でしたが、「/r」のオプションで、配下すべてのファイルが対象となります。


カレントディレクトリの配下に「sub_dir」ディレクトリがあります。


「sub_dir」ディレクトリの配下には「sub_sub」ディレクトリとsub1.txt、sub2.txtファイルがあります。


「sub_sub」ディレクトリ の配下には「sub_sub1.txt」ファイルがあります。
bat(バッチファイル)に「/r」のオプションに変更し、保存後実行してください。
@echo off
for /r %%i in (*) do
echo %%i
paus


カレントディレクトリ配下の全てのファイルが、表示されました。
オプション③-対象の値を決める
初期値と増加と閾値を決めて繰り返す事が出来ます。よく見るパターンだと思います。基本の形は下記になります。
for /l %%変数1文字 in (初期値,増加分,閾値) do コマンド
batファイルに下記を記入して、保存後実行して見て下さい。
@echo off
for /l %%i in (3,3,12) do
echo %%i
pause


3から始まり、3ずつ増え、12を超えたら終了になっています。
オプション④-対象をテキストファイル内にする
テキスト中身の内容を対象にします。一番ややこしいですが、様々な事が可能です。基本の形は下記です。
for /f サブオプション %%i in (text1.txt) do echo %%i
オプション④には更に「サブオプション」があります。
- tokens ・・・左から指定した番号のものを取得する。デフォルトはスペース区切り
- delims ・・・スペース以外を区切り文字にする
- eol ・・・指定した値から始まる行をとばす
- skip ・・・頭から指定した数行を無視する
カレントディレクトリの「text1.txt」に、下記を記入して保存してください。
1 2 3 4
a1 b2 3b 4b
111 222 333 444
12.34.56.78
tokens ・・・n番目の文字を取得する
batファイルに下記を記入して、保存後実行して見て下さい。
@echo off
for /f "tokens=1,3" %%i in (text1.txt) do echo %%i %%j
pause
text1.txtファイルの1と3番目の文字を取得するbatファイルです。


1 2 3 4
a1 b2 3b 4b
111 222 333 444
12.34.56.78
テキストファイルのスペース区切りの1と3番目が取得出来ています。
delims ・・・区切り文字を決めて取得する
batファイルに青「delims」のオプションを追記して、保存後実行して見て下さい。
@echo off
for /f "tokens=1,3 delims=." %%i in (text1.txt) do echo %%i %%j
pause
「.」を区切り文字として、text1.txtファイルの1と3番目の文字を取得するbatファイルです。


1 2 3 4
a1 b2 3b 4b
111 222 333 444
12.34.56.78
1から3は区切り文字「.」がない為、1番目の全てが表示されています。4行目は「.」で区切られた1と3番目を表示しています。
eol ・・・指定した値から始まる行をとばす
batファイルに「eol=a」のオプションを追記して、保存後実行して見て下さい。
@echo off
for /f "tokens=1,3 delims=. eol=a" %%i in (text1.txt) do echo %%i %%j
pause
「.」を区切り文字として、text1.txtファイルの1と3番目の文字を取得する、かつ「a」から始まる行をとばすbatファイルです。


1 2 3 4
a1 b2 3b 4b
111 222 333 444
12.34.56.78
「a」から始まる2行目が消えています。その他は先程の結果と同じです。
skip・・・ 頭から指定した数行を無視する
batファイルに青背景のオプションを追記して、保存後実行して見て下さい。
@echo off
for /f "tokens=1,3 delims=. eol=a skip=2" %%i in (text1.txt) do echo %%i %%j
pause
「.」を区切り文字として、text1.txtファイルの1と3番目の文字を取得する、かつ「a」から始まる行をとばす、かつ1,2行目をとばすbatファイルです。


1 2 3 4
a1 b2 3b 4b
111 222 333 444
12.34.56.78
先頭の2行が消えています。後の結果は同じです。
対象をコマンドの結果にする
最後はコマンドの結果を対象として、値を取得しましょう。構文は下記です。
for %%i in (`コマンド`) do コマンド
batファイルに下記を記入して、保存後実行して見て下さい。
@echo off
dir
for /f "tokens=1,4 usebackq" %%i in (`dir`) do echo %%i %%j
pause
まずdirコマンドで表示しています。その後、dirの結果の1,4番目を取得して見ました。(区切りはデフォルトのスペース)


上はdirコマンドの結果です。下はコマンド結果の1と4番目の「日時」と「ファイル名」を取得出来ています。
まとめ:bat forで繰り返しを行う
batでforを使用して繰り返す基本構文は以下です。
for オプション %%変数1文字 in (対象) do コマンド
オプションは以下の通りです。
デフォルト(オプション無し)はカレントディレクトリの「ファイル」とする。
- /d ・・・対象をカレントディレクトリの「ディレクトリ」のみとする。
- /r ・・・対象をカレントディレクトリと、その配下のサブディレクトリの「ファイル」も含む。
- /l ・・・対象の値を決める
- /f ・・・対象をテキストファイル内にする
対象をカレントディレクトリにしたり、配下のファイルも含む全てにしたり、自分で指定した値などにする事が可能
対象をテキストファイルの中身にする事も可能で、更にオプションが必要となる
テキスト中身の内容を対象にします。基本の形は下記です。
for /f サブオプション %%i in (text1.txt) do echo %%i
オプション④には更に「サブオプション」があります。
- tokens ・・・左から指定した番号のものを取得する。デフォルトはスペース区切り
- delims ・・・スペース以外を区切り文字にする
- eol ・・・指定した値から始まる行をとばす
- skip ・・・頭から指定した数行を無視する
batのforで繰り返しをマスターすれば、業務効率化も出来るので是非マスターして業務に取り入れて見て下さい。