そうだ!バックアップしよう!!

実はイントルのSSD(X25E64GB 8万円也!)を買ってしまいました。
イントルが出すぐらいなので、それなりの信頼性は担保されてるんでしょうけど、まだHDDに比べればひよこみたいなもんなので、ある日突然のデータ消失という不安が拭いきれない。

そこで、定期的にバックアップしちゃいましょう、と考えました。

Windowsに付いてくるバックアップユーティリティは、専用のファイルフォーマットでバックアップされる仕様となっており、ちゃんと復元できるかどうか非常に怪しいので、ファイルをそのままコピーしてくれるバックアップツールを探すと、

BunBackup
http://homepage3.nifty.com/nagatsuki/bunbackup/bunbackup.htm

というのが使いやすそうなので、これを採用する。コマンドラインもサポートされてるので、タスクスケジューラに登録すれば、勝手にバックアップしてくれる。結構いいカンジ。

さてこのままでは、単なる紹介記事で、ここに書くほどのネタではない。(単にSSDを買った自慢をしたかったというのもあるがw)

バックアップというのは大量のファイルコピーが発生するので、できればPCを触っていない時にやってほしいものだ。ちょうどタスクスケジューラには、「アイドル時」に任意のプログラムを開始することができるのでこれを使用する。

ところでバックアップってどれぐらいの頻度でやるものだろうか?
1日に一回バックアップしておけば、十分なような気がします。(最悪1日分の作業が消失するが、私には許容範囲)

なので、例えば午前中にバックアッププログラムが起動すれば、午後はもういくらPCがアイドル状態になっても、バックアップはしなくて結構。だけど、タスクスケジューラではそこまできめ細やかな設定はできないので、自作スクリプトを作ってみた。

option explicit

'// 前回実行日時保存先
const LAST_EXECUTE_LOG_FILE = "last_execute_log.txt"
'// バックアップを実行してもよいインターバル
const INTERVAL_DAYS = 1
'// バックアッププログラム実行ファイル
const BACKUP_EXE_FILE = """C:\Program Files\util\BunBackup\BunBackup.exe"""
'// バックアップ設定ファイル
const BACKUP_SETTING_FILE = """C:\Program Files\util\BunBackup\work_pc.lbk"""

dim fso
set fso = createobject("Scripting.FileSystemObject")

'// まずは前回起動時刻を取得
dim buf
With fso.OpenTextFile(LAST_EXECUTE_LOG_FILE,1,True)
  If not .AtEndOfLine Then
    buf = .ReadAll
  end if
  .Close
End With

buf = trim(buf)
buf = replace(buf, vbcrlf, "")

if buf = "" then buf = "1970/01/01"

if datediff("d", buf, now) < INTERVAL_DAYS then
  '// 前回実行時から、あんまり時間が経過していないので、まだバックアップの必要は無い
  WScript.Quit 1
end if

'// ある程度経過していたら、バックアップ実行するのだが、
'// 先に現在時刻をファイルに書き込む

'// 1行ずつ書き込み(書き込み専用でOpen、無ければ新規作成)
With fso.OpenTextFile(LAST_EXECUTE_LOG_FILE, 2, true)
    .Write now
    .Close
End With

'// バックアップ実行
Dim objWshShell
Set objWshShell = WScript.CreateObject("WScript.Shell")
objWshShell.Run BACKUP_EXE_FILE & " /AUTO:" & BACKUP_SETTING_FILE, 0

この内容を backup.vbs として保存して(環境にあわせてパスを修正する必要あり)、タスクスケジューラに登録すればOK。
バックアッププログラム起動時に現在時刻をファイルに書き出しておき、次回起動時には、1日以上経過してるかを見てるだけだ。

ちなみに、WScript.Shell.Run メソッドの第2引数を 0 にしないと、コマンドプロンプトが表示されてしまいます。