title.png


MirrDirの概要

 MirrDirは、定期的に、あらかじめ決めた手順に従って、自動的に、ミラーリングバックアップを実行するために設計されたツールです。

ディレクトリのミラーリングバックアップ

 指定したディレクトリの内容を、そのディレクトリ構造ごと別な場所にバックアップします。コピー元ディレクトリ内のデータ(ファイル)が更新されて新しくなったら、新しいファイルだけをバックアップしなおして、鏡に映った虚像の様に、コピー元とバックアップ先の内容を一致させるのがミラーリングバックアップです。

バックアップシーケンスの作成、実行

 複数のディレクトリを別な場所にバックアップしたり、1つのディレクトリを複数の場所にバックアップしたり、バックアップの手順は人それぞれだと思います。こうした手順を指定して、バックアップ手順(シーケンス)を作成して保存することができます。予めシーケンスを作っておけば、次からは保存したシーケンスファイルをダブルクリックするだけで実行可能となります。
 シーケンスを指定できるので、頻繁に更新されるディレクトリに関してはn世代バックアップを実現することができます。

スケジュール設定で定期的・自動的バックアップ

 日次・週次・月次等、スケジュールを設定して定期的・自動的にバックアップを取ることができます。
 タスクトレイに常駐し、MirrDirが起動している時だけ、スケジュールが実行されます。スケジュールを実行させたくない時には、MirrDirを終了するか、スケジュール実行の一時停止(ポーズ)が可能です。

シェアウェア

 MirrDirはシェアウェアです。シェアウェア登録されなくてもMirrDirの機能は完全で、1ヶ月を目安として暫定的にMirrDirを試用することができます。試用期間を越えて利用する場合は、同梱のドキュメントに従って、作者まで送金してください。
 著作者はMirrDirを用いて生じたいかなる損害に対しても責任を負えませんので、あくまでユーザの責任において使用してください。

※送金する前に、必ず試用してください。

制限

 ファイル名にunicodeの特殊な文字(正確には、シフトJIS(S-JIS)に変換した時、対応する文字が無くて変換できない文字)が含まれていた場合、そのファイルに対する操作(コピー、削除など)ができず、「ファイルが見つからない」などのエラーが出力されます。
 MirrDirで処理する対象のディレクトリ/ファイル名にはシフトJIS(S-JIS)のコード範囲を使ってください。


バックアップの考え方

 大事なデータはバックアップを取りましょう。
 「メディアのクラッシュ」もそうですが、「誤って改変してしまった」、「良かれと思って改変していたがやはり元に戻したい」等々、データを回復したい状況はある日突然訪れます。定期的に、できれば自動的に、また包括的にバックアップを実行することが大切なデータを守る上で重要です。

メディアのクラッシュに備える

 HDDなど、メディアのクラッシュに備えたバックアップは、物理的に異なるメディアへバックアップすることが必要です。
 もし、拠点の火事など消失に備えるなら、地理的に隔たったネットワークディスク等へのバックアップも必要となります。
 MirrDirは、Windowsのファイルシステムからアクセスできる場所であれば、バックアップ先に指定することが可能です。

ミラーリングバックアップ

 指定したディレクトリの内容を、そのディレクトリ構造ごと別な場所(ディレクトリ)にバックアップします。ディレクトリ内のデータが更新されて新しくなったら、新しいデータだけをバックアップしなおして、鏡に映った虚像の様に、元ディレクトリとバックアップ先の内容を一致させるのがミラーリングバックアップです。
 元ディレクトリとバックアップ先の内容を一致させるため、定期的に実行することが必要となります。
 MirrDirは、スケジュールを設定しておいて、定期的にミラーリングを実行することが可能です。

n世代バックアップ

 頻繁に更新するデータのバックアップはどうしていますか?
 「メディアが壊れた」、だけではなく、「操作ミスで間違って改変」してしまったり、「試しに改変してみたけど、やっぱり元に戻したくなった」時、バックアップからデータを復元したら、何か月前に戻りますか?過去に戻りすぎて愕然とした経験はありませんか?
 n世代バックアップという方法があります。頻繁に更新するデータは、定期的に、複数のバックアップを取ります。バックアップを7つ取ることにしましょう。バックアップ1〜7というディレクトリを作ります。
 これらのディレクトリに対して、定期的に以下の処理を以下の手順で実行します。

  バックアップ6をバックアップ7にミラーリングする
  バックアップ5をバックアップ6にミラーリングする
    :
  バックアップ1をバックアップ2にミラーリングする
  ターゲットをバックアップ1にミラーリングする

n_genbak.png

 間違えて順番を逆に実行してしまうと、全てのディレクトリが同じ内容になってしまいますので、ご注意ください(実行する順番に意味があります)。
 定期的=毎日、とすると、バックアップnには、n日前のデータがバックアップされています。
 定期的=2日毎、とすると、バックアップnには、2n日前のデータがバックアップされています。
 こうしておくと、間違って改変してしまった日付まで戻れば、最小限のバックデートで済みます。
 更に、蛇足気味になりますが、バックアップA〜Dというディレクトリを追加作成し、週一回、以下の処理を追加します。

  バックアップCをバックアップDにミラーリングする
  バックアップBをバックアップCにミラーリングする
  バックアップAをバックアップBにミラーリングする
  バックアップ7をバックアップAにミラーリングする

 こうしておくと、先ほどのバックアップ1〜7と合わせて、バックアップDには、バックアップ7の4週間前のデータが残ります。
 メディアのクラッシュからデータを守る手段としては、異なるメディアにバックアップを取ることが必要となりますが、n世代バックアップの様に、変更を加えたデータを元に戻すことが目的であれば、同じメディアへのバックアップでも事足ります。普段使っているHDDにバックアップ用のディレクトリを作成して対応しても良いと思います。
 MirrDirでは、バックアップシーケンスの作成とスケジュール実行機能によって、n世代バックアップを実現することが可能です。

まとめ

 バックアップの目的を理解した上で複数の手段を講じる必要があります。そこまでして守る価値のあるデータであれば、ですが。データの重要性を吟味した上でバックアップ計画を作成してください。
 MirrDirは、定期的に、あらかじめ決めた手順に従って、自動的に、ミラーリングを実行するため、に設計されたツールです。


シーケンスの例

特定のファイルをコピーする

 バックアップすべきファイルの場所とファイル名が決まっている場合、特定のファイルをコピーするシーケンス例です。

コマンド オペランド パス1 パス2 備考
Copy 1 C:\
 Users\
 Documents\
 file1.txt
C:\
 Users\
 Documents\
 BackUp\
file1.txtを同じ名前でBackUpディレクトリにコピー
Copy 0 C:\
 Users\
 Documents\
 WORK\
 file1.txt
C:\
 Users\
 Documents\
 BackUp\
 work_file1.txt
別な階層のファイルをコピー。上のファイルとファイル名が同じなので、ファイル名を変更してコピー。
MkDir 0 C:\
 Users\
 Documents\
 BackUp\
 DATA
  BackUpディレクトリの下にDATAディレクトリを作成。
Copy 1 C:\
 Users\
 Documents\
 DATA\
 file2.txt
C:\
 Users\
 Documents\
 BackUp\
 DATA\
上で作成したディレクトリにコピー。

 2回目以降の実行では、3番目のMkDirがエラー(既にディレクトリが存在している)になりますが、放置しても問題はないはず(実行結果ログにエラーが残って、ウザったいくらい)。

ディレクトリが見つかった時だけミラーリング

 指定したディレクトリが見つかった時だけ、ミラーリングコマンドを実行するシーケンス例です。

コマンド オペランド パス1 パス2 備考
IsDir 0 \\pc_name\
 Documents\
  ネットワーク上のPC、「pc_name」の共有ディレクトリDocumentsが見つかったか?
SkipNZ 0 コメントを記入可能   pc_nameが見つからなかったらスキップ
MirrDir 0 C:\
 Users\
 Documents\
\\pc_name\
 Documents\
上で見つかったディレクトリにミラーリング
SkipEnd 0 コメントを記入可能   ここまでスキップ

 "\\pc_name\path"と指定することで、ネットワーク上のディレクトリも指定可能なので、指定したPCが起動して、ネットワーク上にディレクトリが見えている時だけ実行することが可能です。

不要なファイルやディレクトリを削除する

 不要なファイルやディレクトリを削除するシーケンス例です。

コマンド オペランド パス1 パス2 備考
Del 0 C:\
 Users\
 Documents\
 file1.tmp
  不要なファイルを削除する。可能なら、ごみ箱へ移動する。
Del 1 C:\
 Users\
 Documents\
 file2.tmp
  オペランド=1なので、ごみ箱へ移動せず、直接削除する。
Nop 0 コメントを記入可能   Nopは何もしないコマンド。シーケンスファイル中にコメントを記入するのに使用可能。
RmDir 1 C:\
 Users\
 Documents\
 TEMP\
  TEMPディレクトリを削除する。オペランド=1なので、TEMPディレクトリの中にファイルが残っていても、強制削除する。
RmDir 0 C:\
 Users\
 Documents\
 APPDAT
  APPDATを削除しようとしますが、オペランド=0なので、もし、APPDATディレクトリの中に1つでもファイルが見つかった場合はエラーになって失敗します。APPDATが空だった場合は削除します。

 スケジュールに登録して、定期的にクリーンアップすることができます。

バックアップ実行後にPCをシャットダウンする

 バックアップ実行後にPCをシャットダウンするシーケンス例です。

コマンド オペランド パス1 パス2 備考
MirrDir C:\
 Users\
 Documents\
N:\
 BACKUP\
 Documents\
バックアップします。途中でユーザの入力を求めないようなオペランドに設定すること。
Message 30 バックアップ終了。シャットダウンしますか?   シャットダウンして良いか問いあわせるウインドウを出力する。オペランドの秒数待って回答が無ければ、「はい」ボタンが押されたものとして、0を返す。
SkipNZ 0 コメントを記入可能   「はい」以外のボタンが押された時、Messageコマンドが非0を返すので、スキップする。
ShutDown 0 コメントを記入可能   PCをシャットダウンする。
SkipEnd 0 コメントを記入可能   ここまでスキップ

 夜寝る前に実行すれば、時間のかかるバックアップ作業を実行後、自動的にPCをシャットダウンすることができます。Messageコマンドが「シャットダウンして良いか?」問いあわせますが、30秒でタイムアウトして「はい」ボタンを押したのと同じ値を返すので、30秒間ユーザの操作が無かった場合はシャットダウンを実行します。
 最後のShutDownをExitにすると、シャットダウンの代わりに、MirrDirだけを終了することが可能です。

実行結果が特定のエラーコードだった時の処理

 コマンドを実行した時、エラーが起きると、エラーコードを返します。特定のエラーコードだった時に対処するためのシーケンス例です。

コマンド オペランド パス1 パス2 備考
Copy 1 C:\
 file_not_exist.aaa
C:\
 Users\
 Documents\
パス1のファイルをコピーします。
StatEq 2 コメントを記入可能   オペランド=2は、Copyコマンドでファイルが見つからなかった場合のエラーコード。Copyの返り値が2だった場合0、2以外だった場合非0を返します。
SkipNZ 0 コメントを記入可能   Copyの返り値が2以外だったらスキップする。
Message 0 指定されたファイルが見つからず、Copyが失敗しました。   エラーメッセージを出力する。
SkipEnd 0 コメントを記入可能   ここまでスキップ

 Copyすべきファイルが見つからなかった場合にメッセージを出力するようにしました。エラーの内容によっては、何らかの対処が可能な場合もあるでしょう。StatEqの他に、数値の大・小を比較するStatGt/StatLtコマンドも使用可能です。

外部シェルコマンドを使う

 外部シェルコマンドを使用するシーケンス例です。

コマンド オペランド パス1 パス2 備考
Shell −1 C:\
 Documents\
 docs.txt
  実行ファイルがテキストファイル(.txt)なので、拡張子に関連付けられたテキストエディタでファイルを開きます。オペランド<0なので、エディタの終了を待たずに次のシーケンスを実行します。
Shell 0 C:\
 Documents\
 BAT\
 test.bat
  バッチファイルを実行します。実行が終了するまで待って、その終了コードを返します。
StatLt 5 コメントを記入可能   バッチファイルの終了コードがオペランド(=5)より小さかった時、0を返します。
SkipZ 0 コメントを記入可能   バッチファイルの終了コードが5より小さかった時スキップ
Message 0 終了コードは5以上でした。   メッセージ出力
SkipEnd 0 コメントを記入可能   ここまでスキップ

 バッチファイルの最後がシェルのExit命令で、ファイルサイズやファイル数などを返したりする様に記述してあれば、MirrDirだけでは実現不可能な機能を実装することも可能です。

スタックを使う

 スタックを使うシーケンス例です。

コマンド オペランド パス1 パス2 備考
Push 1 コメントを記入可能   スタックに1(オペランド)を積んで、コマンドスタックは上から:1/0……
Push 22 コメントを記入可能   スタックに22(オペランド)を積んで、コマンドスタックは上から:22/1/0……
Push 333 コメントを記入可能   スタックに333(オペランド)を積んで、コマンドスタックは上から:333/22/1/0……
Pop 0 コメントを記入可能   333を読み出して、コマンドスタックは:22/1/0……
Pop 0 コメントを記入可能   22を読み出して、コマンドスタックは:1/0……
Pop 0 コメントを記入可能   1を読み出して、コマンドスタックは:0……

 16段のLIFO(後入れ/先出し型)です。

エラーコードを複数回参照する

 Del命令などが返すエラー値に対して、「エラーコード=2の時は処理A、エラーコード=5の時は処理B」など、操作を分けたい場合のシーケンス例です。

コマンド オペランド パス1 パス2 備考
Del 1 C:\
 DOCS\
 file1.txt
  ファイル削除
StatPush 0 コメントを記入可能   Delのエラーコードをコマンドスタックに積む
StatEq 2 コメントを記入可能   エラーコード2(オペランド)か?
SkipNZ 0 コメントを記入可能   エラーコード≠2の時はスキップ
Message 0 ファイルが見つからなかった。   処理A
SkipEnd 0 コメントを記入可能   ここまでスキップ
Pop 0 コメントを記入可能   コマンドスタックに積んでおいたDelコマンドのエラーコードを取り出す。
(StatPush) 0 コメントを記入可能   もし、この先でもう一回Delコマンドのエラーコードを参照したい場合は、ここでもう一度積みなおす。
StatEq 5 コメントを記入可能   エラーコード5(オペランド)か?
SkipNZ 0 コメントを記入可能   エラーコード≠5の時はスキップ
Message 0 ファイルのアクセスが拒否された   処理B
SkipEnd 0 コメントを記入可能   ここまでスキップ

 直前に実行したコマンドの状態しか参照できない上、次のコマンドを実行してしまうと新しい状態値で上書きされてしまうため、StatPushコマンドを使って状態値をスタックに積んでおくことで、後で取り出して(Popコマンド)参照可能にします。
 Popしてデータを取り出したら、スタックから消えてしまいますので、もし、後でもう一度参照したいなら、もう一度StatPushしなおすことを忘れずに。

特定のPCで実行した時、バックアップ対象パスを変える

 同じ様なディレクトリをミラーリングする時、PC(の環境)によって、ドライブ名などが微妙に異なる場合の場合分けをするシーケンス例です。

コマンド オペランド パス1 パス2 備考
IsPcName 0 pc_name   現在実行中のPC名とパス1の文字列を比較して結果を返す。
SkipZ 0 コメントを記入可能   pc_nameだったらスキップ
MirrDir 0 C:\
 Users\
 Documents\
D:\
 Doc_Bak
外付けストレージ、ドライブ名"D:"にバックアップする。
SkipEnd 0 コメントを記入可能   ここまでスキップしてきたら非0を返し、スキップしてこなかったら0を返す。
SkipZ 0 コメントを記入可能   pc_nameではなかった時、スキップ。SkipEndの直後に実行することで、「else」的な動作になる。
MirrDir 0 C:\
 Users\
 Documents\
E:\
 Doc_Bak
外付けストレージ、ドライブ名"E:"にバックアップする。
SkipEnd 0 コメントを記入可能   ここまでスキップ

 PCによって、外部に接続したストレージのドライブ番号が異なってしまう場合があるので、PC名を判定して、バックアップ先を選択することができます。

タイムスタンプを確認して、コピー方向を決定する

 2つのファイルの更新日時を比較して、新しい方を古い方にコピーします。

コマンド オペランド パス1 パス2 備考
CompTime 0 C:\
 Users\
 Documents\
 file_1
C:\
 Users\
 Documents\
 BAKUP\
 file_1.bak
ファイルのタイムスタンプ(更新日時)を比較して返す。
StatLt 0 コメントを記入可能   直前の返り値が0(オペランド)より小さい時非0、そうではなかった時0を返す。
SkipNZ 0 コメントを記入可能   更新時間の差が0以上(パス1が新しい)の時、スキップ
Copy 0 C:\
 Users\
 Documents\
 BAKUP\
 file_1.bak
C:\
 Users\
 Documents\
 file_1
file_1.bakの方が新しかった時にここへ到達する。file_1.bak→file_1へ回復する。
SkipEnd 0 コメントを記入可能   ここまでスキップしてきたら非0を返し、スキップしてこなかったら0を返す。
SkipZ 0 コメントを記入可能   SkipEndの直後に実行することで、「else」的な動作になる。
Copy 0 C:\
 Users\
 Documents\
 file_1
C:\
 Users\
 Documents\
 BAKUP\
 file_1.bak
更新日時が等しいか、ファイルが見つからないなどのエラー時にここへ到達する。file_1→file_1.bakへコピーする。
SkipEnd 0 コメントを記入可能   ここまでスキップ

 2つの場所に置かれたファイルの新しい側を保持するシーケンスができました。

現在の時間より一定時間以上古かった場合に削除する

 特定のファイルが、現在の時間より一定時間より古かった場合に削除します。

コマンド オペランド パス1 パス2 備考
Touch 0 C:\
 now.tmp
  ファイルの更新日時を現在の時間に設定する。now.tmpが見つからないとエラーになるので注意。
CompTime 0 C:\
 now.tmp
C:\
 My Documents\
 BACKUP\
 file_1.dat
現在の時間(now.tmpの更新日時)とfile_1.datの更新日時を比べる。
StatLt 604800 コメントを記入可能   オペランドは、7日×24時間×60分×60秒=604800秒を表す。CompTimeが時間の差分を秒で返すため。
SkipZ 0 コメントを記入可能   file_1.datが1週間より新しいファイルだった場合、スキップ
Del 0 C:\
 My Documents\
 BACKUP\
 file_1.dat
  file_1.datが1週間以上古かった場合にここへ到達する。file_1.datを削除。
SkipEnd 0 コメントを記入可能   ここまでスキップ

 現在時刻を設定するための一時ファイル(この例ではnow.tmp)が1つ必要ですが、現在時刻と任意ファイルの更新日時を比較して、一定以上古いファイルを削除することができました。


download

home