Y子です。
今回は、「過去に作成したファイルをコピーして、今日の作業用のファイルを作る。ファイル名には今日の日付を付ける」というバッチを作成します。
下記の記事の派生版、といった感じです。
・バッチファイルでファイル・フォルダをバックアップする(日付文字列付きコピー)
【確認環境:Windows 10 Home (Bld. 19044.1766)】
仕様
- ファイルやフォルダをコピーする。
- コピー先は、コピー元と同じフォルダとする。
- コピー先ファイル名・フォルダ名は、 今日の日付 を拡張子前に付けて、「
filename_yyyymmdd.docx
」「dirname_yyyymmdd
」等とする。 - コピー元ファイル・フォルダ名の末尾に日付文字列がある場合、今日の日付に置き換える。
- コピー元ファイル・フォルダが存在しない場合、コピーしない。
- コピー先ファイル名・フォルダ名が既に存在している場合、コピーしない。
- 引数が1つでない場合、コピーしない。
使い方
- バッチファイルに、ファイル名やフォルダ名を引数で与えることで動作する。
- バッチファイルに、ファイルやフォルダをマウスでドロップしてもよい。
- バッチファイルのショートカットを「
sendto
」に置き、右クリック「送る」から選択してもよい。
コード
copy_with_curdatestr.bat
@echo off
setlocal
rem 引数がない場合は、最後に飛んで終了する
if "%~1"=="" (
echo 【エラー】引数がありません
goto :label_end
)
rem 引数が複数ある場合は、最後に飛んで終了する
if not "%~2"=="" (
echo 【エラー】引数が2つ以上あります
goto :label_end
)
rem 対象ファイル・フォルダ…例:「C:\work dir\test.txt」「C:\work dir\dir」
set str_file=%~1
rem コピー元のファイルまたはフォルダが存在しない場合は、最後に飛んで終了する
if not exist "%str_file%" (
echo 【エラー】ファイルが存在しません:"%str_file%"
goto :label_end
)
rem 上位フォルダのフルパス…例:「C:\work dir\」
set str_dir=%~dp1
rem ファイル名分割…拡張子なし「test」と拡張子のみ「.txt」
set str_fn=%~n1
set str_ex=%~x1
rem 今日の日付文字列を作成……例:「20220630」
set str_date=%date:~0,4%%date:~5,2%%date:~8%
rem 旧ファイル名の末尾が「_日付」に一致するか判定
echo %str_fn:~-9% | findstr /r "\<_[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]\>" > nul 2>&1
if "%errorlevel%"=="1" (
rem 一致しない=日付がなかった場合…末尾に日付を結合する
set str_new_fn=%str_fn%_%str_date%%str_ex%
) else (
rem 一致する=日付があった場合…末尾を削って日付を結合する
set str_new_fn=%str_fn:~0,-9%_%str_date%%str_ex%
)
rem 新しいファイル名(フルパス)
set str_newfile=%str_dir%%str_new_fn%
echo 新ファイル名:%str_newfile%
rem リネーム不可の(新ファイル名が既存ファイルと重複する)場合、最後に飛んで終了する
if exist "%str_newfile%\" (
echo 【エラー】同じ名前のフォルダが存在します:"%str_new_fn%"
goto :label_end
) else if exist "%str_newfile%" (
echo 【エラー】同じ名前のファイルが存在します:"%str_new_fn%"
goto :label_end
)
rem コピーする:フォルダの場合
if exist "%str_file%\" (
echo d | xcopy /s /e /h /k /q "%str_file%" "%str_dir%%str_new_fn%" > nul 2>&1
rem コピーする:ファイルの場合
) else (
echo f | xcopy /r /q "%str_file%" "%str_dir%%str_new_fn%" > nul 2>&1
)
rem コピー成否を確認
if exist "%str_file%" (
echo コピーしました:%str_new_fn%
) else (
echo 【エラー】コピーできませんでした:%str_new_fn%
)
:label_end
echo 処理を終了しました
endlocal
pause
説明
ファイル名の、拡張子を除いた末尾に、アンダースコア+日付(数字8文字)を付加します。
コピー元ファイル名の、拡張子を除いた末尾9文字が、アンダースコア+数字8文字だったら、末尾9文字を削除してから付加します。
使い方・実行結果
まず、C:\work dir\test01.txt
というファイルを、バッチファイルにドロップしてみます。
実行結果
新ファイル名:C:\work dir\test01_20220630.txt
コピーしました:test01_20220630.txt
処理を終了しました
続行するには何かキーを押してください . . .
同じファイルを再度ドロップすると、こうなります。
実行結果
新ファイル名:C:\work dir\test01_20220630.txt
【エラー】同じ名前のファイルが存在します:"test01_20220630.txt"
処理を終了しました
続行するには何かキーを押してください . . .
C:\work dir\test02_20220620.txt
というファイルだと、こうなります。
実行結果
新ファイル名:C:\work dir\test02_20220630.txt
コピーしました:test02_20220630.txt
処理を終了しました
続行するには何かキーを押してください . . .
おわりに
いにしえのファイル管理、という気もしますが、手軽で確実でもあるので、同じような運用を続けてる方は多いのではないでしょうか。
わたしの職場だけだったりして…。
では!