Skip to content

Instantly share code, notes, and snippets.

@jfut
Created October 6, 2021 04:45
Show Gist options
  • Star 2 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save jfut/39d3126da480c0cb7fecdff459425b17 to your computer and use it in GitHub Desktop.
Save jfut/39d3126da480c0cb7fecdff459425b17 to your computer and use it in GitHub Desktop.
Robocopy Backup
@echo off
::
:: フルバックアップ
::
:: 1. robocopy バックアップ
:: 2. バックアップ元のすべてのファイルのアーカイブ属性を Off に設定
:: 3. バックアップ先ディレクトリの隠し属性削除
:: 注意: 1. 実行後、2. の実行までに更新されたファイルは、
:: バックアップから漏れますが許容することにします。
::
:: /NP コピー完了率非表示
:: /MIR ミラーモード
:: /E 空のディレクトリをコピーする
:: /DCOPY:DAT コピーするファイル属性
:: /XA:SH システムファイルと隠しファイルを除外する
:: /XJ ジャンクションを除外する
:: ジャンクションを含めると、ジャンクション先が削除される事故が発生するため除外します
:: https://answers.microsoft.com/ja-jp/windows/forum/all/robocopy%E5%90%8C%E6%9C%9F%E3%81%AB%E3%81%8A/a028d945-5947-4495-9a49-4a15988225fe
:: /XD 除外フォルダー
:: /R:2 /W:1 リトライ 2 回、リトライ待機時間 1 秒
::
:: 参考:
:: https://n-archives.net/software/robosync/articles/incremental-differential-backup/
:: https://n-archives.net/software/robosync/articles/incremental-backup-example/
::
:: @author Jun Futagawa
::
:: 設定
::
set BACKUP_DIR=Z:\Backup
set LOG_FILE=%BACKUP_DIR%\backup-full.log
set TT=%time: =0%
:: 2021-10-05-142212-full
set DEST_DIR_NAME=%date:~0,4%-%date:~5,2%-%date:~8,2%-%TT:~0,2%%TT:~3,2%%TT:~6,2%-full
::
:: 最も古いディレクトリを検索して最新バックアップディレクトリにリネーム
:: ex: 2021-10-05-142212-full
::
set OLDEST_DIR_NAME=
for /F "usebackq" %%i in (`DIR /AD /B /O-N "%BACKUP_DIR%\*-full"`) do set OLDEST_DIR_NAME=%%i
if "%OLDEST_DIR_NAME%" == "" (
echo "初回バックアップ"
) else (
echo move "%BACKUP_DIR%\%OLDEST_DIR_NAME%" "%BACKUP_DIR%\%DEST_DIR_NAME%"
move "%BACKUP_DIR%\%OLDEST_DIR_NAME%" "%BACKUP_DIR%\%DEST_DIR_NAME%"
if not %ERRORLEVEL% == 0 goto EXIT_ERROR
if not exist "%BACKUP_DIR%\%DEST_DIR_NAME%" goto EXIT_ERROR
)
::
:: ログファイルクリア
::
echo > "%LOG_FILE%"
::
:: C:\Users\admin
::
:: バックアップ元
set SRC_DIR=C:\Users\admin
:: バックアップ先
set DEST_DIR=%BACKUP_DIR%\%DEST_DIR_NAME%\C-admin
::
:: バックアップ: /MIR オプションなし
:: https://answers.microsoft.com/ja-jp/windows/forum/all/robocopy%E5%90%8C%E6%9C%9F%E3%81%AB%E3%81%8A/a028d945-5947-4495-9a49-4a15988225fe
::
robocopy "%SRC_DIR%" "%DEST_DIR%" /LOG+:"%LOG_FILE%" /NP /MIR /E /DCOPY:DAT /XA:SH /XJ /R:2 /W:1 /XD "$RECYCLE.BIN" "System Volume Information" "INetCache\Content.IE5"
:: アーカイブ属性: Off
attrib -a "%SRC_DIR%\*.*" /s
:: 隠し属性解除
attrib -s -h "%DEST_DIR%"
::
:: D
::
:: バックアップ元
set SRC_DIR=D:
:: バックアップ先
set DEST_DIR=%BACKUP_DIR%\%DEST_DIR_NAME%\D
:: バックアップ
robocopy "%SRC_DIR%" "%DEST_DIR%" /LOG+:"%LOG_FILE%" /NP /MIR /E /DCOPY:DAT /XA:SH /XJ /R:2 /W:1 /XD "$RECYCLE.BIN" "System Volume Information"
:: アーカイブ属性: Off
attrib -a "%SRC_DIR%\*.*" /s
:: 隠し属性解除
attrib -s -h "%DEST_DIR%"
::
:: E
::
:: バックアップ元
set SRC_DIR=E:
:: バックアップ先
set DEST_DIR=%BACKUP_DIR%\%DEST_DIR_NAME%\E
:: バックアップ
robocopy "%SRC_DIR%" "%DEST_DIR%" /LOG+:"%LOG_FILE%" /NP /MIR /E /DCOPY:DAT /XA:SH /XJ /R:2 /W:1 /XD "$RECYCLE.BIN" "System Volume Information"
:: アーカイブ属性: Off
attrib -a "%SRC_DIR%\*.*" /s
:: 隠し属性解除
attrib -s -h "%DEST_DIR%"
::
:: 終了
::
EXIT /B 0
:EXIT_ERROR
echo エラーが発生したため終了します。バックアップに失敗しました。
EXIT /B 0
@echo off
::
:: 増分バックアップ
::
:: /NP コピー完了率非表示
:: /S 空のディレクトリをスキップ
:: /DCOPY:DAT コピーするファイル属性
:: /M アーカイブ属性: On のファイルをコピーして、アーカイブ属性を Off にする
:: /XA:SH システムファイルと隠しファイルを除外する
:: /XJ ジャンクションを除外する
:: ジャンクションを含めると、ジャンクション先が削除される事故が発生するため除外します
:: https://answers.microsoft.com/ja-jp/windows/forum/all/robocopy%E5%90%8C%E6%9C%9F%E3%81%AB%E3%81%8A/a028d945-5947-4495-9a49-4a15988225fe
:: /XD 除外フォルダー
:: /R:2 /W:1 リトライ 2 回、リトライ待機時間 1 秒
::
:: 参考:
:: https://n-archives.net/software/robosync/articles/incremental-differential-backup/
:: https://n-archives.net/software/robosync/articles/incremental-backup-example/
::
:: @author Jun Futagawa
::
:: 設定
::
set BACKUP_DIR=Z:\Backup
set LOG_FILE=%BACKUP_DIR%\backup-inc.log
set TT=%time: =0%
:: 2021-10-05-142212-inc
set DEST_DIR_NAME=%date:~0,4%-%date:~5,2%-%date:~8,2%-%TT:~0,2%%TT:~3,2%%TT:~6,2%-inc
::
:: ログファイルクリア
::
echo > "%LOG_FILE%"
::
:: C:\Users\admin
::
:: バックアップ元
set SRC_DIR=C:\Users\admin
:: バックアップ先
set DEST_DIR=%BACKUP_DIR%\%DEST_DIR_NAME%\C-admin
:: バックアップ
robocopy "%SRC_DIR%" "%DEST_DIR%" /LOG+:"%LOG_FILE%" /NP /S /DCOPY:DAT /M /XA:SH /XJ /R:2 /W:1 /XD "$RECYCLE.BIN" "System Volume Information" "INetCache\Content.IE5"
:: 隠し属性解除
attrib -s -h "%DEST_DIR%"
::
:: D
::
::
:: バックアップ元
set SRC_DIR=D:
:: バックアップ先
set DEST_DIR=%BACKUP_DIR%\%DEST_DIR_NAME%\D
:: バックアップ
robocopy "%SRC_DIR%" "%DEST_DIR%" /LOG+:"%LOG_FILE%" /NP /S /DCOPY:DAT /M /XA:SH /XJ /R:2 /W:1 /XD "$RECYCLE.BIN" "System Volume Information"
:: 隠し属性解除
attrib -s -h "%DEST_DIR%"
::
:: E
::
:: バックアップ元
set SRC_DIR=E:
:: バックアップ先
set DEST_DIR=%BACKUP_DIR%\%DEST_DIR_NAME%\E
:: バックアップ
robocopy "%SRC_DIR%" "%DEST_DIR%" /LOG+:"%LOG_FILE%" /NP /S /DCOPY:DAT /M /XA:SH /XJ /R:2 /W:1 /XD "$RECYCLE.BIN" "System Volume Information"
:: 隠し属性解除
attrib -s -h "%DEST_DIR%"
::
:: 古い増分バックアップフォルダーの削除
:: 直近 20 回分保存、それ以外で 14 日より古いものを削除
::
powershell -command "dir "%BACKUP_DIR%\*-inc" | sort -Descending | select -skip 20 | ? { $_.LastWriteTime -lt (Get-Date).AddDays( -14 ) } | del -recurse"

Windows 用バックアップスクリプト

本スクリプトは設定を誤るとバックアップ元のファイルが消失します。本スクリプト利用してデータの消失等の如何なる問題が発生しても一切の責任を負いかねます。

フルバックアップ: robocopy-backup-full.bat

注意: 実行時、バックアップ先ディレクトリ(例: Z:\Backup\2021-10-05-142212-full)をエクスプローラーで開いていたり、配下のファイルを何らかのソフトで開いているとバックアップフォルダーの移動に失敗してバックアップが失敗します。

コマンド プロンプトから タスク スケジューラーに登録します。

schtasks /Create /TN "Robocopy フルバックアップ" /TR "C:\Users\admin\bin\robocopy-backup-full.bat" /SC WEEKLY /D SUN /ST 03:00 /F

増分バックアップ: robocopy-backup-inc.bat

コマンド プロンプトから タスク スケジューラーに登録します。

schtasks /Create /TN "Robocopy 増分バックアップ" /TR "C:\Users\admin\bin\robocopy-backup-inc.bat" /SC WEEKLY /D MON,TUE,WED,THU,FRI,SAT /ST 03:00 /F

タスク スケジューラーの実行履歴の保存

管理者権限のコマンド プロンプトから TaskScheduler の実行履歴を保存するように設定します。デフォルト無効です。

wevtutil sl Microsoft-Windows-TaskScheduler/Maintenance /e:true /rt:true /ab:true /ms:1073741824
wevtutil sl Microsoft-Windows-TaskScheduler/Operational /e:true /rt:true /ab:true /ms:1073741824

Robocopy のログファイルの見方

  • 新しいディレクトリ: バックアップ先にコピーされるファイル
  • 新しいファイル: バックアップ先にコピーされるファイル
  • *EXTRA File: バックアップ先から削除されるファイル、ジャンクションを辿って元ファイルを削除しようとしている場合は要注意
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment