0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

バッチファイルで今日の作業用のファイル・フォルダを作成する(日付文字列付きコピー)

Last updated at Posted at 2022-06-29

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
処理を終了しました
続行するには何かキーを押してください . . .

おわりに

いにしえのファイル管理、という気もしますが、手軽で確実でもあるので、同じような運用を続けてる方は多いのではないでしょうか。
わたしの職場だけだったりして…。

では!

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?