11
9

More than 5 years have passed since last update.

windowsでファイルやディレクトリを日毎にバックアップするバッチ

Posted at

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をタスクスケジューラに登録します。

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です。コメントに使用方法を書きました。

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

以上

11
9
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
11
9