バッチファイルを使用しますが、forコマンドが上手くいきません
そのような悩みを持っている人も多いのではないでしょうか?
bat(バッチファイル)で繰り返しを行いたい場合は、おなじみ「for」を使用します。バッチファイルの「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ファイルがあります。ここがカレントディレクトリになります。
1つの「sub_dir」フォルダと3つのファイル(text1.txtファイルからtext3.txtファイル)があります。
batファイルのforのオプション、デフォルトパターン
オプションなしのデフォルトパターンです。「対象」にはカレントディレクトリにあるファイル名などを指定します。例えば「test*」や「*」などです。
bat(バッチファイル)に下記コマンドを書いて、保存後実行してください。
@echo off
for %%i in (*) do
echo %%i
pause
bat(バッチファイル)のデフォルトでは、カレントディレクトリに存在する「ファイル」が、すべて表示されています。
batファイルforのオプション①-ディレクトリを対象とする
① /d ・・・カレントディレクトリの「ディレクトリ」を対象とする
forのオプションのデフォルトでは「ファイル」でしたが、カレントディレクトリにある「ディレクトリ」を対象にしたい場合には「/d」を使用します。
「対象」にはカレントディレクトリにあるフォルダ名などを指定します。例えば「sub_dir」や「*」などです。
bat(バッチファイル)に「/d」のオプションを追記し、保存後実行してください。
@echo off
for /d %%i in (*) do
echo %%i
pause
bat(バッチファイル)の「/d」オプションでは、カレントディレクトリに存在する「ディレクトリ」が、すべて表示されています。
batファイルforのオプション②- ディレクトリ配下全てのファイルを対象とする
②/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
pause
bat(バッチファイル)の「/r」オプションではカレントディレクトリ配下の全てのファイルが、表示されました。
batファイルforのオプション③-対象の値を決める
初期値と増加と閾値を決めて繰り返す事が出来ます。よく見るパターンだと思います。基本の形は下記になります。
for /l %%変数1文字 in (初期値,増加分,閾値) do コマンド
bat(バッチファイル)に「/l」のオプションを下記のように記入して、保存後実行して見て下さい。
@echo off
for /l %%i in (3,3,12) do
echo %%i
pause
上のbatファイルの例では3から始まり、3ずつ増え、12を超えたら終了になっています。
bat(バッチファイル)の「/l」オプションでは初期値,増加分,閾値などを指定して実行できます。
batファイルforのオプション④-対象をテキストファイル内にする
forの繰り返しはテキスト中身の内容を対象にします。一番ややこしいですが、様々な事が可能です。基本の形は下記です。
for /f サブオプション %%i in (text1.txt) do echo %%i
「対象」にはファイル名を指定します。
forコマンドオプション④には更に「サブオプション」があります。
- tokens ・・・左から指定した番号のものを取得する。デフォルトはスペース区切り
- delims ・・・スペース以外を区切り文字にする
- eol ・・・指定した値から始まる行をとばす
- skip ・・・頭から指定した数行を無視する
カレントディレクトリの「text1.txt」に、下記を記入して保存してください。
1 2 3 4
a1 b2 3b 4b
111 222 333 444
12.34.56.78
forのサブオプション①-tokens ・・・n番目の文字を取得する
batファイルに下記を記入して、保存後実行して見て下さい。
@echo off
REM 1と3番目の文字を取得する
for /f "tokens=1,3" %%i in (text1.txt) do echo %%i %%j
pause
上のbatファイルの例では「text1.txt」ファイルの1と3番目の文字を取得します。
1 2 3 4
a1 b2 3b 4b
111 222 333 444
12.34.56.78
テキストファイルのスペース区切りの1と3番目が取得出来ています。
takensオプションではn番目の文字を取得する事が出来ます。
forのサブオプション②-delims ・・・区切り文字を決めて取得する
batファイルに青「delims」のオプションを追記して、保存後実行して見て下さい。
@echo off
REM 区切り文字を,として1と3番目の文字を取得する
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番目を表示しています。
delimsサブオプションでは区切り文字を指定して取得できます。
forのサブオプション③-eol ・・・指定した値から始まる行をとばす
batファイルに「eol=a」のオプションを追記して、保存後実行して見て下さい。
@echo off
REM 区切り文字を,として1と3番目の文字を取得するがaから始まるものは省く
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行目が消えています。その他は先程の結果と同じです。
eolサブオプションでは、指定した値から始まる行を対象外にできます。
forのサブオプション④-skip・・・ 頭から指定した数行を無視する
batファイルに青背景のオプションを追記して、保存後実行して見て下さい。
@echo off
REM 区切り文字を,として1と3番目の文字を取得するがaから始まるものと頭から2行目までは省く
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行が消えています。後の結果は同じです。
skipサブオプションでは、先頭の行から指定した行数を対象外にする事が出来ます。
batファイルforのおまけオプション:対象をコマンドの結果にする
バッチファイルの「for」ではコマンドの結果を対象として、値を取得する事も可能です。構文は下記です。
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番目の「日時」と「ファイル名」を取得出来ています。
バッチファイルの「for」ではコマンドの結果を対象として、値を取得する事も可能です。
まとめ:batファイルのforで繰り返しを行う
batでforを使用して繰り返す基本構文は以下です。
for オプション %%変数1文字 in (対象) do コマンド
batファイルの「for」で使用できるオプションは以下の通りです。
デフォルト(オプション無し)はカレントディレクトリの「ファイル」とする。
- /d ・・・対象をカレントディレクトリの「ディレクトリ」のみとする。
- /r ・・・対象をカレントディレクトリと、その配下のサブディレクトリの「ファイル」も含む。
- /l ・・・対象の値を決める
- /f ・・・対象をテキストファイル内にする
対象をカレントディレクトリにしたり、配下のファイルも含む全てにしたり、自分で指定した値などにする事が可能
対象をテキストファイルの中身にする事も可能で、更にオプションが必要となる
テキスト中身の内容を対象にします。基本の形は下記です。
for /f サブオプション %%i in (text1.txt) do echo %%i
オプション④には更に「サブオプション」があります。
- tokens ・・・左から指定した番号のものを取得する。デフォルトはスペース区切り
- delims ・・・スペース以外を区切り文字にする
- eol ・・・指定した値から始まる行をとばす
- skip ・・・頭から指定した数行を無視する
batの「for」で繰り返しをマスターすれば、業務効率化も出来るので是非マスターして業務に取り入れて見て下さい。