こんなことを知りたい人へ向けて書いています
- Windowsバッチファイルを使って特定のファイルを集め、保存しておきたい方
- 何のファイルがどこに入っているか分からなくなったので、ある条件のファイルを一括で集めたい方
- 日付をファイル名の前に付けて保存し管理したい方
目次
コピペで使える特定ファイル収集バッチファイルコード
ここでは、「複数のフォルダ内にある、条件に一致した特定のファイルだけを集めてきて、それらのファイル名の先頭に日付を追加する」というバッチファイルコードを紹介します。
このようなバッチファイルは、重要なファイルだけを一つのフォルダに集め保管するときに使えます。また、ファイル名を一目見れば日付が分かるようになるので、いつ作られたファイルなのかを簡単に認識できるようになりますので、ファイルの時系列的な管理にも有用です。
例えば、以下のようなフォルダ構成を考えてみましょう。
フォルダ1
∟ファイル1.txt
∟ファイル1.dat
フォルダ2
∟ファイル2.txt
∟ファイル2.dat
フォルダ3
∟ファイル3.txt
∟ファイル3.dat
フォルダ1~フォルダ3の三つのフォルダが存在します。さらにその中にtxtファイルとdatファイルの二種類のファイルが一つずつ存在します。
この中から、txtファイルだけを「保管」というフォルダに集めたとします。また、集めるときにはそれらのファイル名の先頭に集めた今日の日付の付け加えることにしましょう。
このようなバッチファイル「bring_and_adddate.bat」のプログラムコードは以下のようになります。コピペして適当なバッチファイルに張り付ければ使えます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
@echo off rem 今日の日付の取得 set year=%date:~0,4% set month=%date:~5,2% set day=%date:~8,2% rem 今日の日付を結合する set date2=%year%%month%%day% rem 取得するファイルリストを作成 dir /b /s *.txt > file.list rem 「for」ループで変数を変化させるためのもの setlocal enabledelayedexpansion rem 「for」ループによって、ファイルを集め日付を付加する for /f %%a in (file.list) do ( rem 変数「filename」にファイル名が入る set filename=%%~nxa rem ファイルをコピーして、現在の日付を頭に付ける copy "%%a" .\保管\%date2%_!filename! ) rem 「file.list」ファイルの削除 del file.list |
このバッチファイルを作成した場所にあるフォルダ内のすべてのtxtファイルを「保管」フォルダに集め、ファイル名の先頭に現在日付を付け加えます。
初めの4行目から6行目は今日の年月日をそれぞれ変数「year」、「month」、「day」に代入している部分です。そして、9行目でそれらを合成し「YYYYMMDD(例:20170930)」の形式にして、変数「date2」へ代入しています。この辺りは、「日付フォーマットを「YYYYMMDD」へ変更する(例:2017/06/28 → 20170628) -やりたいことから検索-」が詳しいので参考にして下さい。
12行目では、すべてのtxtファイルを探し出し、「file.list」ファイルへ書き込んでいます。これは、このバッチファイルが置いてあるフォルダ内だけでなく、そのフォルダにあるフォルダ内も、さらにそのまたフォルダ内もすべてのフォルダから探し出します。これは、「dir」コマンドに「/s」オプションを付けているからですが、詳しくは「dir(フォルダとファイルの一覧を表示) -コマンド別解説-」を参照して下さい。
18行目の「for」ループは「file.list」に書き込んだファイルに対してループを回しています。ファイル名が「%%a」に入ってループが回りますが、この時点ではファイルのフルパスが入っている状態です。
ですので、21行目の「%%~nxa」で「%%a」のフルパスからファイル名と拡張子だけを取り出しているのです。これらについては、「パス名の文字列を自在に切り取る -やりたいことから検索-」が詳しいです。
そして、24行目で「copy」コマンドにより、対称ファイルを「保管」フォルダに保存します。このとき、保存先の名前に変数「date2」を使って、現在日付を付加していることに注目です。
一応最後の行で、「file.list」ファイルを削除しています。
以下は、実行後の「保管」フォルダの中身です。
自分の目的に応じて編集する
ここでは、上記で示したバッチファイルのコードを自分なりに編集するためのヒントを紹介します。
バッチファイルのコードをもう一度示します。全く同じものです。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
@echo off rem 今日の日付の取得 set year=%date:~0,4% set month=%date:~5,2% set day=%date:~8,2% rem 今日の日付を結合する set date2=%year%%month%%day% rem 取得するファイルリストを作成 dir /b /s *.txt > file.list rem 「for」ループで変数を変化させるためのもの setlocal enabledelayedexpansion rem 「for」ループによって、ファイルを集め日付を付加する for /f %%a in (file.list) do ( rem 変数「filename」にファイル名が入る set filename=%%~nxa rem ファイルをコピーして、現在の日付を頭に付ける copy "%%a" .\保管\%date2%_!filename! ) rem 「file.list」ファイルの削除 del file.list |
保存対象ファイルを変更する
前節で示した実行後のフォルダの中身から分かるように、フォルダ1~フォルダ3にはtxtファイルの他にdatファイルも存在しましたが、txtファイルだけが集められています。これは、プログラムの12行目で「*.txt」と指定しているからです。
例えば、txtファイルではなくdatファイルのみを集めたい場合には、この部分を「*.dat」に変更すれば、datファイルだけが収集できますし、「第1回_*.doc」などとすれば、ファイル名が「第1回_」から始まるワードファイル(docファイル)のみを集めることができます。
また、全てのファイルを集めたい場合は、「*.*」や「*」と指定すればよいでしょう。この部分を自分の集めたいファイルに合わせて編集しましょう。
コピーではなく、移動させたい
このバッチファイルでは、コピーをして保存しているので、元のファイルにファイルは残ります。しかし、コピーではなく移動して、元のファイルが残らないようにしたい場合は、24行目の「copy」コマンドを「move」コマンドに置き換えればよいでしょう。
また、コピー先や移動先のフォルダを変更したい場合はそのパスを編集すればオッケーです。
日付の付ける位置や日付の書式を変更したい
いま日付を付ける位置はファイル名の先頭です。日付を拡張に設定したい場合は、21行目の「%%~nxa」を「%%~na」と変更し、24行目の「%date2%」の位置を「.\保管\!filename!_%date2%」とします。これで、「ファイル1.20170930」のような形式となります。
「%%~nxa」の「x」は拡張子を表示するためのもので、この「x」を省略すると拡張子なしの形式になるのです。
また、現在日付を「YYYYMMDD」から「MMDD」としたい場合は、9行目の「%year%%month%%day%」を「%month%%day%」とすればよいでしょう。
これらのように、自分好みの動作をするよう編集してご使用下さい。何か不明な点や実現したい機能がどうやればできるのか分からない場合はお気軽に「お問い合わせ」からご連絡下さい。