n-Archives.net

RoboSync設定事例:増分バックアップ(直近20回,14日以内保存)

Table of Contents

シナリオ

Robocopyを用いて、差分バックアップ、増分バックアップを行う方法について、記事「RoboSyncを使って差分・増分バックアップを設定してみる」で紹介しました。今回は、RoboSyncを用いた実践的な増分バックアップの設定をしてみます。以下のようなシナリオを想定してRoboSyncでの設定方法について作ってみました。

 バックアップシナリオ

  • スクリプト実行により増分バックアップを実行。
  • 毎回個別フォルダにバックアップを取得。
  • 1時間毎の自動起動、および、手動による起動を想定。
  • 直近20回、または、14日以内のバックアップは保存する。それ以外のものは削除する。

 

RoboSync設定方法

上記シナリオを実現する増分バックアップ設定例は以下になります。

実行前スクリプト

cd /d Z:\backup\My Data
set TT=%time: =0%
set dest=%date:/=%%TT:~0,2%%TT:~3,2%%TT:~6,2%-inc

実行前スクリプトでは、カレントディレクトリを変更し、コピー先フォルダ名を作成します。コピー先フォルダ名は、"20200112192030-inc" のフォーマットになります。

 

実行後スクリプト

if %errorlevel% ==  0  rmdir /s /q %dest%
powershell -command "dir *-inc | sort -Descending | select -skip 20 | ? { $_.LastWriteTime -lt (Get-Date).AddDays( -14 ) } | del -recurse"

まず、増分バックアップの場合、変更されたファイルが1つもなければ、コピー先フォルダは空のフォルダになるので、残しておく必要がありません。その場合には、コピー先フォルダを削除してしまいます。%errorlevel% は直前に実行したrobocopy の戻り値を参照しています。robocopyの戻り値が 0 というのは、「コピーしたファイルが一つもなかった」ことを示しています。その場合、コピー先フォルダを削除(rmdir)しています。

robocopyの戻り値については、以下記事をご覧ください。

 

次に、2行目の powershellコマンドですが、以下のような流れで処理が行われます。

  1. *-inc というフォルダを取得
  2. ファイル名を降順(新しい順)に並べ替える
  3. 最初の20個についてはスキップし、21個目以降のリストにする
  4. それぞれのフォルダの更新時刻を確認し14日以上前のファイルだけを抽出
  5. 抽出されたフォルダを削除

となります。つまり、「直近20回、または、14日以内のバックアップは保存する。それ以外のものは削除する」となります。

バックアップするフォルダの中に、読み取り専用ファイルや隠しファイルが存在する場合、強制的に削除できるよう、del コマンドに -force オプションを追記し、del -recurse -force のようにしてください。

また、細かい注意ですが、dir のファイル指定の個所は dir * のようにせず、dir *-inc のように明示的にフォルダの一部文字列を指定することをお勧めします。万一の事故で、関係ないファイルやフォルダまで削除してしまうことを防止するためです。

 

いかがでしょうか。是非やってみてください。

 

改版履歴

(2020/2/9) 実行後スクリプトのpowershellでフォルダを削除する箇所において、読み取り専用ファイルや隠しファイルが存在した場合、delコマンドに -force オプションを追記するコメントなどを追加。

 



Related Articles

 

Comments from Readers

管理者   2022-10-08 12:27:35
じんべるさん、RoboSync使っていただいておりありがとうございます。

まず意図しない動作になっている直接の原因ですが、
%errorlevel%変数が、robocopyの戻り値ではなく、
attribコマンドの戻り値を参照してしまっていることが原因です。
%errorlevel%は「直前に実行したコマンドの戻り値」を参照する変数ですので、
最後に実行したattribコマンドの戻り値(0)を参照してしまいます。

attribコマンド実行が必要なければ、attribコマンドを実行しないようにしておくのが一番いいのですが、
もし、attribコマンドを実行する必要がある場合、attribコマンドを直接「実行後スクリプト」に
適切に記述する必要があります。
オプション設定で「コピー元がルートフォルダで…"attrib -s -h" を実行する。」のチェックがオンになっていると、
robocopyの戻り値をerrorlevelで参照できませんので、オフにしてください。

スクリプト修正例としては以下が考えられます。

【スクリプト例①】
----
set robocopy_exitcode=%errorlevel%
attrib -s -h 20221005170513-inc
if %robocopy_exitcode% == 0 rmdir /s /q 20221005170513-inc
----
robocopy実行直後に、%errorlevel%を robocopy_exitcodeという変数に退避しておき、必要なときにその変数を参照します。

【スクリプト例②】
----
if %errorlevel% == 0 (
rmdir /s /q 20221005170513-inc
) else (
attrib -s -h 20221005170513-inc
)
----
if文を最初に記述し、attribコマンドをelse内に記述します。
elseや()の前後に空白文字を入れるのを忘れないでください。

じんべる   2022-10-08 10:18:11
いつも楽しく拝見しています。

質問です。

実際にはコピーされたファイルがあるのに Robocopyの戻り値でが返り、フォルダが削除されますが原因が判りません。

アドバイスお願いできますでしょうか。

よろしくお願いします。

合計 コピー済み スキップ 不一致 失敗 Extras
ディレクトリ: 116 116 0 0 0 0
ファイル: 1726 1 1725 0 0 0
バイト: 837.84 m 2.8 k 837.84 m 0 0 0
時刻: 0:00:00 0:00:00 0:00:00 0:00:00
終了: 2022年10月5日 17:05:13


D:\FAX受信のバックアップ>attrib -s -h "D:\FAX受信のバックアップ\20221005170513-inc"

D:\FAX受信のバックアップ>echo 0
0

D:\FAX受信のバックアップ>if 0 == 0 rmdir /s /q 20221005170513-inc

Submit your comment
Name:
Comment:
Submission type:



管理者より個人的に返信をご希望の方は、コメント中に必ずメールアドレスを記載してください。記載がないと返信できませんのでご注意ください。

If you want personal response from the author, please do not forget to write your email address in the comment. Otherwise, the author can not reply.

投稿されたコメントは手動で処理されるため、記事として登録されるまで1日程度かかります。

Submitted comments will be processed manually. So, please understand it will take about a day to publish your comment.