このブログはパソコンの操作方法の説明をすることが多いので、よく画像を使います。ひとつの記事で10~20枚、多いと50枚ぐらいです。キャプチャソフトで画面のスクリーンショットを撮り、1、2、3・・・、と番号を振って管理しています。
サーバーにアップロードする前に、他の記事の画像と区別するために、記事を書いた日の日付を挿れているのですが、毎回手作業でリネームするのは地味にしんどいです。
このような要望を満たしてくれるフリーソフトとかいっぱいありそうですが、調べたところ Windows のバッチファイルで同じことができそうだったので、挑戦してみることにしました。
準備
テスト環境を用意します。適当な名前のテキストファイルをいくつか用意します。
ファイル名を変更する動作の確認にしか使わないので、内容はどうでもよろしいです。
再度、右クリックメニューから「テキスト ドキュメント」ファイルを作成。
拡張子が「.txt」になっていますが、これを「.bat」に変更。
以降、このバッチファイルをメモ帳などのテキストエディタで編集し、保存した後ダブルクリックで動作が確認できます。
コマンドプロンプトから操作してもよいのですが、この方が簡単かと。
ファイル名の変換
カレントディレクトリにおいて、1番目の引数に対象となるファイル名を指定し、2番目の引数に変更後の新しいファイル名を指定します。
1 | rename (対象となるファイル名) (変更後のファイル名) |
次のように記述しても同じです。
1 | ren (対象となるファイル名) (変更後のファイル名) |
日付の取得
コマンドプロンプトでの確認。
1 2 | C:¥>echo %date% 2015/11/20 |
ちなみに、現在の時刻も取得できます。
1 2 | C:¥>echo %time% 20:48:23.31 |
文字列の置換
取得した日付は「YYYY/MM/DD」の形式になっているので、スラッシュを削除して「YYYYMMDD」にしてからファイル名として利用します。このときスラッシュを一括で削除するには、次のような文字列置換の構文を利用します。
1 | %(対象の文字列):(置換前の文字列)=(置換後の文字列)% |
置換後の文字列を空にしておけば、削除したことと同じになります。
1 2 3 4 5 | @echo off set dateStr=%date% set formatDate=%dateStr:/=% echo %formatDate% |
時刻でコロン(:)やドット(.)を消去するなら次のようになります。
1 2 3 4 5 6 | @echo off set timeStr=%time% set formatTime=%timeStr::=% set formatTime=%formatTime:.=% echo %formatTime% |
文字列の結合
1 2 3 4 5 6 7 | @echo off set dateStr=%date% set timeStr=%time% set delimiter=_ echo %dateStr%%timeStr%%delimiter% |
ファイル名を一括変換する
カレントフォルダのすべてのテキストファイルに日付を挿入するので、FOR コマンドを使って繰り返し処理を行います。FOR コマンドの構文は次のとおりです。
1 | FOR %%変数 IN (セット) DO コマンド |
それでは、今までの基本的な構文を使って、ファイル名の先頭にに日付を挿入するバッチファイルを作成してみます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | @echo off rem 日付の取得 set dateStr=%date% set formatDate=%dateStr:/=% rem 時刻の取得 set timeStr=%time% set formatTime=%timeStr::=% set formatTime=%formatTime:.=% rem ファイル名の先頭に挿入する文字列を生成 set delimiter=_ set head=%formatDate%%formatTime%%delimiter% rem subラベル以下の処理を毎回呼び出す for %%f in (*.txt) do call :sub %%f exit /b rem ファイル名を変換する処理をサブルーチン化 :sub rename %1 %head%%1 goto :EOF |
先ほど作成したバッチファイルをダブルクリックして動作を確認してください。
日本語やスペースを含んだファイル名にも対応する
このバッチファイルでだいたい目的は達成できたのですが、このソースコードは日本語や半角スペースが含まれているファイル名を変換してくれません。せっかくなので、対応させておきましょう。こちらの一文を修正するだけです。
1 | for %%f in (*.txt) do call :sub %%f |
%%f をダブルクォーテーションで囲みます。
1 | for %%f in (*.txt) do call :sub "%%f" |
これで日本語を含むファイル名にも対応できます。
Comment
わかりやすく教えて頂きありがとうございます。
一つ質問させて頂ければと思いましたが、
時間が9時台と10時台でファイル先頭への挿入が出来ない場合があるのですが
何か検討がつきそうな部分はございますか?
時刻に一桁が入っているとうまくいかなくなるのかと思い
構文を自分で修正できるか考えましたが思いつかず…
申し訳ございませんがお時間のある時にでも
見て頂くことは可能でしょうか?
シリウス様
当ブログにお越しいただき誠にありがとうございます。
差し支えなければソースコードを拝見したいのですが、よろしいでしょうか?
コメント欄にソースコードを貼り付けるとエスケープ処理しなければならないので、
メールフォームから送信していただけるとありがたいです。
名前や題名を省略して本文だけで送信できるはずです。
その際に、フリーメールの捨て垢で結構ですので添えていただけると助かります。