今回は「for」コマンドを使用した複数のファイルを対象とした処理方法(ループ処理)を学びます。これによって、同じ処理を何度も書かなくて済むようになります。その他にも、「for」コマンドを使うメリットはたくさんあります。
ただし、「for」は奥が深く、オプションもたくさん存在し、オプションによって大きく動作が変わるため少々複雑です。しかし、すべてのオプションの使い方を覚える必要はありません。まずはよく使うものから習得していきましょう。
「for」文を習得すれば、もう初心者では決してありません。windowsバッチ中級者といってよいでしょう。
【入門講義 第8章の内容】
「for」文を使った「ループ処理」
- メリット 同じ処理を何度も各必要が無くなるほか、様々なメリットが存在する
- アドバイス 「for」文は奥が深いが、まずはよく使うものから覚えていく
その他の関連しそうな記事
指定した回数だけループ処理をする
ループ処理とは、同じような処理を何度も繰り返すことです。ループ処理を使うことで何度も同じようなプログラムを書かずに済みます。
例えば、「echo」コマンドを使って1から20まで表示したいとき、ループ処理を使わずに書くと、
1 2 3 4 5 6 7 |
@echo off echo 1 echo 2 echo 3 … echo 20 |
となりますが、これをループ処理を使って書き直すと、
1 2 3 4 5 6 |
@echo off set cmax=20 for /l %%a in (1,1,%cmax%) do ( echo %%a ) |
となり非常にスッキリとしたプログラムとなります。
「第8章」フォルダの下にバッチファイル「count20.bat」を作り上記のプログラムを書き込んで、コマンドプロンプトで実行してみてください。
1から20まで数字が表示されたと思います。
上記のプログラム例のように、ある決められた回数のループ処理を行うときは、
1 2 3 |
for /l %%[アルファベット1文字] in ([開始する数],[増加させる数],[終了する数]) do ( [処理] ) |
という形式で書きます。
「for」のオプション「/l」は指定した回数だけ「do ( )」の括弧中の処理を繰り返すときに用います。
「in ( )」の括弧内にはループを開始する数、増加させる数、終了する数を指定します。「count20.bat」の例では1から始めて1ずつ増加し、20で終わるプログラムとなります。
「/l」と「in」の間には%%[アルファベット1文字]が入り、[アルファベット1文字]にはa~z, A~Zの文字であればなんでも使えます。「count20.bat」では「a」を使用しています。
そして、「%%a」に「開始する数」から「終了する数」まで「増加させる数」で指定した数だけ増加しながらループ処理が行われます。(「%」記号が2つ必要であることに注意して下さい。)
ループ処理を使えば、表示回数を20回ではなく100回に変更したいときもプログラムの3行目を「set camx=100」と変更するだけでよいので、後からの修正が容易になるというメリットがあります。
ループ処理でファイル名に日付を加えるバッチファイルを改良する
「for」文で、オプションを付けない場合は「in ( )」の括弧内に指定した条件のファイルやフォルダを変数「%%a」に代入してループ処理をします。
例として、「第8章」の下に「test」フォルダを作り、その中に空のファイル(以下3つ)、
test1.txt
test2.txt
test3.txt
を作ります。
そして、これらのファイルの同じ場所にバッチファイル「loop_file.bat」を作り、
1 2 3 4 5 |
@echo off for %%a in (*.txt) do ( echo %%a ) |
と書き込み実行します。
ファイル名が出力されたと思います。「%%a」にはファイル名が一つずつ入ってループが回っています。ここでは、「in (*.txt)」とワイルドカード「*」を使って、すべてのtxtファイルをループ対象としています。
この機能を使って、第6章で作ったファイル名に日付を加えるバッチファイルを改良していきましょう。
おさらいですが、第6章ではバッチファイル「add_date.bat」で引数に指定したファイルの先頭に日付をつけました。
例: 「資料.txt」 → 「20160727_資料.txt」
今のままのバッチファイルでは一度に一つのファイルしか処理できません。また、実行するにはコマンドプロンプトを開き、引数を指定したファイルを打ち込む手間があります。これらを解決していきましょう。
「第6章」の「add_date.bat」を「第8章\test」の中に持ってきて、名前を「add_date2.bat」と変更して下さい。
さらに、中身を以下のように編集します。
1 2 3 4 5 6 7 8 9 10 |
@echo off set year=%date:~0,4% set month=%date:~5,2% set day=%date:~8,2% set date2=%year%%month%%day% for %%a in (*.txt) do ( copy %%a %date2%_%%a ) |
ファイルをコピーする「copy」コマンドをfor文で囲み、フォルダ内のすべてのtxtファイルに対して日付を付け加えるようにしました。
また、すべてのファイルを対象とするため引数の入力は必要はなく、ダブルクリックで実行できるようになります。
実行してみましょう。下図のようにすべてのファイル名に日付が付けば成功です。
フォルダを対象とした処理
次にフォルダに対して、同じように先頭に日付をつけるにはどうしたらよいでしょうか。それには、フォルダを対象にしたコピーは「xcopy」コマンドを使います。
「第8章」の下に「test2」フォルダを作り、さらにこの中に以下の4つのフォルダを作ります。
folder1
folder2
folder3
folder4
ここに「add_date2.bat」を「add_date_folder.bat」という名前でコピーして下さい。この中身をフォルダを対象としたものに編集します。
1 2 3 4 5 6 7 8 9 10 |
@echo off set year=%date:~0,4% set month=%date:~5,2% set day=%date:~8,2% set date2=%year%%month%%day% for /d %%a in (*) do ( xcopy /i /e %%a %date2%_%%a ) |
「add_date_folder.bat」をダブルクリックで実行して下さい。
日付が付いたフォルダが作成されたと思います。
プログラムの変更点は、for文のオプションで「/d」を加えたところです。これはフォルダ名を対象とするループ処理を行うという指示を与えています。
また、「in ( )」の括弧内はすべてのフォルダを対象とするため、ワイルドカード「*」を指定します。
9行目では、「copy」の代わりに「xcopy」を用い、オプション「/i」「/e」を付け加えています。
「/i」は「xcopy」でのコピー先のフォルダ(ここでは、「%date2%_%%a」)が存在しない場合は新しく作るという指示です。
「/e」はフォルダの中身が空でもコピーするという指示です。「/e」オプションを省略すると中にファイルなどが何もないフォルダは対象外になります。試しに、「add_date_folder.bat」から「/e」オプションを付けないバッチファイル「add_date_folder_noE.bat」、
1 2 3 4 5 6 7 8 9 10 |
@echo off set year=%date:~0,4% set month=%date:~5,2% set day=%date:~8,2% set date2=%year%%month%%day% for /d %%a in (*) do ( xcopy /i %%a %date2%_%%a ) |
を作り、「folder1」フォルダと「folder2」フォルダにだけ適当なファイルを置いて実行してみてください(前のバッチでできた日付つきのフォルダは削除してから実行します)。
ここでは、「folder1」フォルダと「folder2」フォルダの中に今回作った「test1.txt」の空ファイルを入れてみました(下図)。
実行すると、「folder1」フォルダと「folder2」フォルダだけ先頭に日付が付いたフォルダができたと思います。これは「/e」オプションを省略すると、中身が空のフォルダはコピーしないようになっているからです。
第8章 まとめ
本章ではfor文を使ったループ処理を学びました。これを使えば、ファイルやフォルダの一括処理ができました。
for文は少し複雑で理解するまで時間がかかるかもしれませんが、使用頻度は非常に高く便利なコマンドですので、使いこなせるようになりましょう。
【入門講義 第8章のまとめ】
- その1 指定回数ループ処理を行うには、「/l」オプションを指定する
- その2 オプション無しはファイル名を対象にループ処理をする
- その3 「/d」オプションを指定するとフォルダを対象にループ処理をする
なにか不明な点やうまくいかない場合は、「お問い合わせフォーム」からお気軽にお問い合わせ下さい。
次章では、for文の続きとしてファイルの中身を自動で書き換えるバッチファイルを作っていきます。
とても分かりやすい説明ありがとうございます。
他にはない丁寧さで初心者の自分も簡単にりかいすることができました。
ありがとうございました。
当サイトで学んでいただきありがとうございます。
きりりん様のお役くに立ててうれしく思います。
今後とも当サイトを宜しくお願い致します。
ご要望等あればお気軽にコメントください。