ドラッグアンドドロップでファイルに更新日付を付加してバックアップするbatファイル

  • 3
    いいね
  • 0
    コメント
この記事は最終更新日から1年以上が経過しています。

ソース

backup.bat
@echo off
setlocal EnableDelayedExpansion

pushd %~dp0

REM 出力先
set outdir=_backup
set log_file=_log.txt

REM バックアップ日時
set bk_date=%DATE:~0,10%
::set bk_date=%bk_date:/=%
set bk_time=%TIME: =0%
set bk_time=%bk_time:~0,5%
::set bk_time=%bk_time::=%

if not exist %outdir%\nul mkdir %outdir%

if exist %outdir%\%log_file% (
    set /p log="変更ログ: "
    echo %bk_date% %bk_time%>>%outdir%\%log_file%
    if not #!log!# == ## (
        echo !log!>>%outdir%\%log_file%
    )
)

::for %%a in (%*) do ( call :Backup %%a )
:loop
if #%1# == ## goto break
call :Backup "%~1"
shift
goto loop
:break

if exist %outdir%\%log_file% (
    echo.>>%outdir%\%log_file%
)

exit

:Backup
REM ファイル更新日時
set upd_datetime=%~t1
set upd_date=%upd_datetime:~0,10%
set upd_date=%upd_date:/=%
set upd_time=%upd_datetime:~11,5%
set upd_time=%upd_time::=%
set target=%outdir%\"%~n1_%upd_date%_%upd_time%%~x1"

if exist %1\nul (
    xcopy /i /e /Y %1 %target%
) else (
    copy /Y %1 %target%
)

if exist %outdir%\%log_file% (
    echo %target%>>%outdir%\%log_file%
)

exit /b

最新ソースは Gist にあります。

使い方

メモ帳でコピペしてファイル名をbackup.batとかにすれば使えます。外部ツールは基本的には不要(のはず)です。

batファイルに任意のファイルをドラッグアンドドロップすることで、ファイル名に更新日付を付加して指定のフォルダ(_backup)にファイルやディレクトリをコピーできます。

hoge.xlshoge_20150312_1931.xlsになって_backupフォルダにコピーされる感じです。

出力先のフォルダはおそらく自動生成されます。

pushdしているので、(試してないけど)UNCパス上でも動くかもしれません。

出力先のフォルダにログファイル(_log.txt)を予めおいておくことで、任意でログも書けます。(ログファイルは自動生成されません。)

Gitでいいじゃん、なんで作ったの?

諸事情でSubversionやGitを入れられない(or リポジトリ作成が手間)な状況でもお手軽にバージョン管理したい。

Windowsだし、batファイルならばメモ帳さえあれば作れる!

これだけならば外部ツールは要らない!

外部ツールを使うなら…

ここ から7za.exe(コマンドラインツール)をダウンロードしておいて、

xcopy /i /e /Y %1 %target%

7za a %target%.zip %1

として僕は使ってます。

こうすれば_backupフォルダにできるのはフォルダのコピーではなくzipファイルです。

追記(2015/4/9)

半角括弧に対応させるため、

for %%a in (%*) do ( call :Backup %%a )



:loop
if #%1# == ## goto break
call :Backup "%~1"
shift
goto loop
:break

に変えました。
どうもfor in (%*)だと半角括弧が入った時に挙動がおかしくなるようです。