この記事のハイライト
「報告書.docx」のファイル名を、バッチ処理により、末尾に日付をつけています。予め古い日付が入っている場合は、現在日付に更新します。複数ファイルも対応しています。
背景
現在もファイル名に日付を含めて管理している会社は少なくありません。色々と議論がある方法だとは思いますが、ルールに従うしかありません。
例として、以下のようなファイル名を考えてみましょう。
- 231024_報告書.docx
- 報告書_231024.docx
課題
このようなファイル名での管理方法は、いくつかの点で不便です。
- 日付を毎回思い出して入力するのが面倒
- 日付の数字を一つずつ打ち込むのが煩わしい
- 更新する度に日付を変更するのが面倒
全社規模でのファイル管理システムの導入は難しい場合もあるでしょう。しかし我々は、個人の範疇で改善策を考えることはできます。
そこで、日付を自動でファイル名に追加するバッチファイルを作成しました。
使用方法
以下のコードをメモ帳や任意のテキストエディタにコピーして、ANSI形式で保存します。保存時の初期名が「新しいテキストドキュメント.txt」となっている場合、これを「AddDate(Top).bat」という名前に変更します。
このバッチファイルにファイルをドラッグアンドドロップすることで、自動的にそのファイル名に日付を追加できます。
もしファイル名にすでに日付が含まれている場合、その日付部分を現在の日付で更新します。もちろん、複数のファイルを一度に処理することも可能です。
ファイルだけでなく、フォルダをドラッグアンドドロップしても、フォルダの名前を変更できます。
右クリックメニューから使用
さらに便利に使用するため、このバッチファイルを「送る」メニューに追加することもできます。具体的な方法としては、Windows+Rキーを同時に押し、「cmd」ウィンドウを開きます。そこで「shell:sendto」と入力してEnterキーを押します。そうすると表示されるフォルダ内に「AddDate(Top).bat」を移動またはコピーします。
これにより、ファイルを右クリックした際のコンテキストメニュー内に「AddDate(Top).bat」が表示され、そこから直接日付の追加が可能となります。
バッチファイルのコード
AddDate(Top)
ファイル名の先頭に日付を追加するバッチファイルのコードは以下の通りです。
@echo off
setlocal enabledelayedexpansion
:LOOP
rem Exit if no filename is provided
if "%~nx1" == "" goto EOF
rem Get the date in YYMMDD format
set "NewDate=!DATE:~2,2!!DATE:~5,2!!DATE:~8,2!"
set "FileName=%~n1"
rem Remove a 6-digit date at the beginning, if it exists
if "!FileName:~0,6!" lss "290000" (
if "!FileName:~0,6!" gtr "200000" (
set "FileName=!FileName:~6!"
)
)
rem Remove a leading underscore or space
if "!FileName:~0,1!"=="_" set "FileName=!FileName:~1!"
if "!FileName:~0,1!"==" " set "FileName=!FileName:~1!"
rem Concatenate the date and filename
set "NewFileName=!NewDate!_!FileName!%~x1"
rem Rename the file
ren "%~1" "!NewFileName!"
rem Move to the next file
shift
goto LOOP
:EOF
endlocal
AddDate(End)
ファイル名の後ろに日付を入力するバッチファイルはこちら。コメント部分は日本語です。
@echo off
setlocal enabledelayedexpansion
:LOOP
rem ファイル名がない場合、処理終了
if "%~nx1" == "" goto EOF
rem 日付をYYMMDD形式で取得
set "NewDate=!DATE:~2,2!!DATE:~5,2!!DATE:~8,2!"
set "FileName=%~n1"
rem 6桁の日付が後ろにあるかチェックして削除
if "!FileName:~-6!" lss "290000" if "!FileName:~-6!" gtr "200000" set "FileName=!FileName:~0,-6!"
rem 8桁の日付が後ろにあるかチェックして削除
if "!FileName:~-8!" lss "20900000" if "!FileName:~-8!" gtr "20000000" set "FileName=!FileName:~0,-8!"
rem アンダースコアやスペースで終わる場合、それを取り除く
if "!FileName:~-1!"=="_" set "FileName=!FileName:~0,-1!"
if "!FileName:~-1!"==" " set "FileName=!FileName:~0,-1!"
rem ファイル名と日付を結合
set "NewFileName=!FileName!_!NewDate!%~x1"
rem リネーム
ren "%~1" "!NewFileName!"
rem 次のファイルに移動
shift
goto LOOP
:EOF
endlocal
最後に
これで、日付の手打ち作業から解放されますね!
-
上記の日付はYYMMDDというタイプ。YYYYMMDD(20231024)の日付で管理する会社もあるかもしれません。
-
特殊な日付環境やお行儀の悪いファイル名は考慮していません。
-
ここまで書いた後に見つけた、同じような内容の記事。日付更新、複数ファイル対応したのが私の記事の特徴ですね。
バッチファイルにドロップして、ファイル名に現在日時を付加する
https://qiita.com/koiwaiwaiko/items/09960b80b31fd02cbd8a