本章ではいろいろなフォルダから複数の目的のファイルを集めてくるバッチファイルを作っていきます(下図のイメージ)。
その他の関連しそうな記事
ファイルを集めるバッチファイルを作る
これは「for」コマンドを使って実現できます。
以下のは、「メモ_1.txt」というファイルを探して「collection」フォルダにコピーしてくるプログラムです。「collect.bat」という名前のファイルに以下のコードを書き込み保存して下さい。
1 2 3 4 5 6 7 |
@echo off dir /b /s メモ_1.txt > list.txt for /f %%a in (list.txt) do ( copy "%%a" .\collection\ ) |
(※「\」は「\」に置き換えて下さい)
次に、以下の四つのフォルダを作ります。
folder1
folder2
folder3
collection
そして、それぞれのフォルダの下に、以下のようなファイルを作ります。
folder1
∟メモ_1.txt
folder2
∟メモ_2.txt
folder3
∟メモ_3.txt
コマンドプロンプトを開き、バッチファイル「collect.bat」を実行しましょう。
すると、「collection」フォルダに「メモ_1.txt」がコピーされました。
プログラムを詳しく見ていきます。
ここで、「dir」コマンドが初登場しました。「dir」は今いるフォルダにあるファイル名などを出力する、フォルダの情報を出力するコマンドです。
コマンドプロンプトで、
1 |
dir |
を実行してみてください。
なにやら色々表示されたと思います。
ここには、このフォルダ内の情報が書かれてあります。
一番右にの列にファイル名・フォルダ名が表示されており、1,2列目にはそのファイル・フォルダの更新日時が表示されています。
3列目には<DIR>もしくは何も書かれてありません。これは、ファイルかフォルダかを表しています。<DIR>がフォルダです。
もう少し情報を絞るために、「/b」オプションを付けてみましょう。
1 |
dir /b |
このフォルダに存在するフォルダ名・ファイル名が表示されています。
「/b」オプションはファイル名またはディレクトリ名のみを表示するオプションです。また、「Commad Prompt.lnk」というのがありますが、これは今開いているコマンドプロンプトのことです。コマンドプロンプトもこのフォルダに存在しているので表示されています。
では、さらに、
1 |
dir /b /s |
とすると、このようにフォルダだけでなく、フォルダ内のファイルに対しても絶対パス形式でその場所が表示されます。「絶対パス」については、「絶対パスと相対パス -コラム-」をご覧ください。
「/s」オプションは「サブフォルダに含まれるファイルやフォルダも全て表示する」というオプションです。「dir」コマンドについて、さらに詳しい情報は、「dir(フォルダとファイルの一覧を表示) -コマンド別解説-」で解説しています。
これに、ファイル名「メモ_1.txt」を指定して実行するとどうでしょう。
1 |
dir /b /s メモ_1.txt |
指定したファイル(ここでは、「メモ_1.txt」)の絶対パスが表示されます。今は、「collection」フォルダにも「メモ_1.txt」が入っているので、計二つのパスが表示されています。
ここまでの知識を元に、バッチファイル「collect.bat」に戻ると、
1 2 3 4 5 6 7 |
@echo off dir /b /s メモ_1.txt > list.txt for /f %%a in (list.txt) do ( copy "%%a" .\collection\ ) |
3行目「dir /b /s メモ_1.txt > list.txt」はメモ_1.txtの絶対パスを「list.txt」に書き出していることが分かります。「> ファイル名」は出力結果をファイルに上書きを意味します。
「>> ファイル名」は既に登場しましたが、こちらは追加記述するコマンドであり動作が違いますので区別するようにしましょう。詳しくは、(「>」と「>>」の違い -コラム-)で解説しています。
続いて、4行目では第9章で登場した「/f」オプションを使用した「for」コマンドを使っています。「/f」オプションは「in ( )」の括弧内に指定したファイルを一行ずつ読み取って「%%a」に入れ、「do ( )」の括弧内をループ処理するものでした。
「list.txt」から一行づつ読み取って(ここでは一行しかない)、「%%a」に代入しているので「%%a」には「メモ_1.txt」の絶対パスが入っているはずです。
そして6行目の「copy」コマンドで、「collection」フォルダへコピーしています。
複数のファイルを集める
一つのファイルだけではなく、複数のファイルを集めたいときにはどうしたらよいでしょうか?
例えば、ファイル名に「メモ_」と付いているファイルだけを集めたいときなどです。
そのときは、ワイルドカード「*」を使って、
1 2 3 4 5 6 7 |
@echo off dir /b /s メモ_*.txt > list.txt for /f %%a in (list.txt) do ( copy "%%a" ./collection/ ) |
とします。
「dir」コマンドのファイル指定を「メモ_*.txt」とし、この条件に当てはまる複数ファイルのパスを「list.txt」ファイルへ書き出します。すると、「for」によるループ処理が「list.txt」に書かれたすべてのファイルに対して行われるため、「メモ_」がついたファイルがすべてコピーされるのです。
上記のプログラムをバッチファイル「collects.bat」として実行し、実際に各フォルダ内の
メモ_1.txt
メモ_2.txt
メモ_3.txt
が集まるか確認しましょう。
ちなみに、上記のプログラムは以下のように省略して書くこともできます。
1 2 3 4 5 |
@echo off for /f %%A in ('dir /b /s メモ_*.txt') do ( copy "%%A" ./collection/ ) |
「for」コマンドの「in( )」の括弧内に直接「dir」コマンドを書いた形です。このときdir文をシングルクォーテーション「’」で囲むのを忘れないようにしましょう。(※ダブルクォーテーション「”」ではエラーになります。)
第15章のまとめ
本章では、特定のファイルを集めるバッチファイルを作成しました。
【入門講義 第15章のまとめ】
いろいろなフォルダから目的のファイルを集めることを学んだ
- その1 「dir」コマンドで、探したいファイル名のリストを取得する
- その2 「for」コマンドを使用してファイル名のループを行う
なにか不明な点やうまくいかない場合は、「お問い合わせフォーム」からお気軽にお問い合わせ下さい。
ここまで読んで下さった皆様へ
バッチファイル超入門講座も、最終章の第15回目の講義まで完了しました。お疲れ様でした。
超入門と言いながら、とっくに入門の域は脱しています。ここまで来ると今まで学んだコマンドの応用で大抵のものは作れるようになっているはずです。あとは、自分の作りたいバッチファイルを作りながら必要に応じて知識を学んでいけば、おのずとバッチファイルマスターになっていくでしょう。
ここまで、読んでくれた読者の皆様に感謝いたします。今後も「知識ゼロからのwindowsバッチファイル超入門」をよろしくお願いします。それでは、失礼いたします。
なんだかんだで最後まで読ませてもらいました。
こういう記事は自分はもちろん、たくさんの人が必要としているものだと思うので、これからもかいていただけたらうれしいです。
ありがとうございました!
一通り習い終えました。
これでバッチ関連の記事が理解できるといいなと思ってます。
ありがとうございました。
一通り拝見致しました。この手のサイトで最後まで読めたのは初めてです。ありがとうございました。
非常に勉強になりました!
ありがとうございました!!
バッチは作れたら便利だけど、全然わからないと思っていました。
一通り実際に試しながら、拝見させていただきました。
とても勉強になりました。
ありがとうございました。