windowsでファイルやディレクトリを日毎にバックアップするバッチ
自宅のファイルを日ごとに圧縮してバックアップしたくなったので作成してみました。windowsに同封されているzipをコマンドプロンプトから使うためには「PowerShell v5」からでないと使えないらしい。WSHを使うとできるみたいだが、調べてみるとものすごく回りくどいことをしないといけない。なので圧縮には7zipというコマンドプロンプト用のexeをダウンロードして使ってます。インストールはしなくてexeを置いておくだけで使えるのでまぁ入れやすいかな。。と。
※次項からのソースを使用されて、何かあった場合は責任もてませんので自己責任でお願いします。
7zip
batchファイルと同じフォルダに「7z1514-extra」というフォルダを作り中身を入れてください。
下記からダウンロードできます。
7-Zip Extraをダウンロードしてください。
https://sevenzip.osdn.jp/download.html
説明:
https://sevenzip.osdn.jp/howto/non-install-compress.html
バックアップ実行シェル
今回は複数のバックアップを取りたかったので呼び出す側のシェルを作ってます。
hogehogeBackup.batをタスクスケジューラに登録します。
@ECHO OFF
set ERROR_LEVEL=0
cd /d %~dp0
call backupByZip バックアップ対象 バックアップ先ディレクトリ 40
if ERRORLEVEL 1 (set ERROR_LEVEL=1)
call backupByZip バックアップ対象2 バックアップ先ディレクトリ2 40
if ERRORLEVEL 1 (set ERROR_LEVEL=1)
if "%ERROR_LEVEL%" EQU "0" (
exit /b 0
) else (
exit /b 1
)
backupByZip.batです。コメントに使用方法を書きました。
@ECHO OFF
rem 毎日バックアップを取る処理です。結果はイベントビュアーにID101で吐かれます。
rem 第一引数:バックアップ対象ファイル、またはディレクトリ
rem 第二引数:バックアップ後のZIPファイル設置ディレクトリ(最後の\は不要)
rem 第三引数:何日前のバックアップを削除するか(削除しない場合は省略可)
rem 例)backupByZip c:\tmp\target.txt c:\backup 10
rem ERROR_MSGをechoしたい場合は「1」にしてください
set DEBUG_MODE=0
set BATCH_DIR=%~dp0
set ZIP_EXE=%BATCH_DIR%\7z1514-extra\7za.exe a -tzip
set TODAY=%date:~0,4%%date:~5,2%%date:~8,2%
set ERROR_MSG=access_backup.batエラー:
set BACKUP_TARGET=%1
set BACKUP_DIR=%2
set NUMBER_OF_BK=%3
if "%BACKUP_TARGET%" EQU "" (
set ERROR_MSG=%ERROR_MSG%引数が足りません。
goto :ERROR
)
if "%BACKUP_DIR%" EQU "" (
set ERROR_MSG=%ERROR_MSG%引数が足りません。
goto :ERROR
)
if not exist %BACKUP_TARGET% (
set ERROR_MSG=%ERROR_MSG%%BACKUP_TARGET%が存在しません。
goto :ERROR
)
if not exist %BACKUP_DIR%\ (
set ERROR_MSG=%ERROR_MSG%%BACKUP_DIR%が存在しないかディレクトリではありません。
goto :ERROR
)
rem 圧縮処理
%ZIP_EXE% %BACKUP_DIR%\%TODAY%.zip %BACKUP_TARGET%
if ERRORLEVEL 1 (
set ERROR_MSG=%ERROR_MSG%%BACKUP_TARGET%の圧縮処理でエラーが発生しました。
goto :ERROR
)
if not exist %BACKUP_DIR%\%TODAY%.zip (
set ERROR_MSG=%ERROR_MSG%%BACKUP_DIR%\%TODAY%.zipが作成できませんでした。
goto :ERROR
)
if "%NUMBER_OF_BK%" EQU "" (
goto :SUCCESS
)
rem 削除処理の為に日付取得
echo WScript.Echo DateAdd("d",-%NUMBER_OF_BK%,Date()) > tmp_date.vbs
for /f "tokens=1-3 delims=/-" %%A in ('cscript //nologo tmp_date.vbs') do set DELETE_DAY=%%A%%B%%C
del tmp_date.vbs
rem 削除処理
if exist %BACKUP_DIR%\%DELETE_DAY%.zip (
del /q %BACKUP_DIR%\%DELETE_DAY%.zip
if ERRORLEVEL 1 (
set ERROR_MSG=%ERROR_MSG%%BACKUP_DIR%\%DELETE_DAY%.zipの削除処理でエラーが発生しました。
goto :ERROR
) else if exist %BACKUP_DIR%\%DELETE_DAY%.zip (
set ERROR_MSG=%ERROR_MSG%%BACKUP_DIR%\%DELETE_DAY%.zipの削除処理でエラーが発生しました。
goto :ERROR
)
)
:SUCCESS
if "%DEBUG_MODE%" NEQ "0" (
echo 成功!!
)
eventcreate /T INFORMATION /ID 101 /D %BACKUP_TARGET%のバックアップ処理が終了しました。
exit /b 0
:ERROR
if "%DEBUG_MODE%" NEQ "0" (
echo %ERROR_MSG%
)
eventcreate /T ERROR /ID 101 /D %ERROR_MSG%
exit /b 1
以上