WinSCPとBunBackupで定期バックアップするバッチ

自宅のPCとレンタルサーバのバックアップを取るためのバッチを書いた。ほぼ自分専用のメモ。

今まではBunBackupを使って3日に1回、定時にバックアップを走らせていたが、自分がPCを使うタイミングが不定期すぎて、バックアップが取れないことが増えてきた。
そこで、BIOS使って夜中にPCを自動起動させ、バッチでバックアップ作業をやらせることにした。ついでにレンタルサーバで動かしてるWebサイトのデータもバックアップする。以下のような流れ。

  1. 週に一度、真夜中にPCを自動起動させる
  2. WinSCPでレンタルサーバの中身をNASにバックアップする
  3. BunBackupでPCのデータをNASにバックアップする
  4. 自動で電源を切る

WinSCP実行→BunBackup実行→シャットダウン という一連の作業を自動で行うためにバッチファイルを作成し、それをタスクスケジューラに登録。PC自動起動後に実行するように設定。

WinSCPのスクリプトファイルを用意

WinSCPを使ってレンタルサーバからローカルへデータを同期させることで、サーバ内データのバックアップを取る。

WinSCPはスクリプトを書くことで、複雑な作業も自動で実行させることができる。
とはいえ今回使うスクリプトは4行ですが。

option batch on
open user@example.jp
synchronize local -delete D:\backup /
exit

1行目:バッチモードオン。
2行目:open セッション名 でサーバへ接続。 セッション名はWinSCP起動時に出てくる接続先一覧に保存されてる名前。
3行目は以下参照。

コマンド 機能
synchronize 同期を行う
local 同期の方向を指定
local はサーバ→ローカル へ同期する
-delete 同期元にないファイルは、同期先からも削除する
D:\backup 同期先の指定
/ 同期元の指定
今回の場合サーバの中身全部を同期するので、ルート示す「/」だけ

4行目、exitでWinSCPを終了させる。

バッチファイル

タスクスケジューラに登録するバッチファイルの中身はこんな感じ。

@echo off
 
rem 電源プラン切り替え→「自動処理」へ
powercfg -setactive a66037f4-5fa2-454c-99cc-316d1d30578d
 
rem 変数定義
SET log=C:\example\_batch\batchlog.csv
SET day=%date:~0,4%%date:~5,2%%date:~8,2%
 
rem WinSCP実行
echo %date% %time%,WinSCP Start >> %log%
C:\example\winscp\WinSCP.exe -console -script=C:\example\_batch\winscp_script.txt -xmllog=C:\example\_batch\scplog\%day%.xml
echo %date% %time%,WinSCP End  >> %log%

rem BunBackup実行
echo %date% %time%,BunBackup Start >> %log%
C:\example\BunBackup\BunBackup.exe -BACKUP:C:\example\BunBackup\backup2016.lbk -NORESULT >> %log% 2>&1
echo %date% %time%,BunBackup End >> %log%
 
rem 電源プラン戻す→「Dell」へ
powercfg -setactive 49ef8fc0-bb7f-488e-b6a0-f1fc77ec649b
 
shutdown -s -t 120
echo シャットダウンを中止するには「shutdown -a」を入力するのだ
cmd.exe -K

4と21行目の powercfg ...は、Windowsの電源プランを変更している。バッチの実行中にスリープしないように、スリープを無効にしたプランに切り換えて、作業完了後に元に戻している。
よほど時間のかかる処理じゃない限り、この設定は別にしなくてもいいかも……。

7行目はバッチの実行ログを記録するファイルの場所を変数にセットしている。
以降の行末に >> %log% とある部分は、ここで定義したログファイルへの記録を行っている。

8行目は、WinSCPの実行ログを年月日ごとのファイルに残すための設定。 日付をファイル名に使える形式にして、変数へセット。

11行目 echo %date% %time%,WinSCP Start >> %log% は日付と時刻をCSV形式でログに書き込み。

12行目 C:\example\winscp\WinSCP.exe -console -script=C:\example\_batch\winscp_script.txt -xmllog=C:\example\_batch\scplog\%day%.xml はWinSCPを実行する部分。 winscp.exeまでのフルパスを書いた後、オプションを並べる。それぞれの意味は以下の通り。

オプション 機能
-console 実行中にコンソール画面を表示する
-script=... =に続けて、最初に用意したスクリプトファイルへのパスを書く
-xmllog=... =に続けて、WinSCPの実行ログを記録するファイルへのパスを書く
%day% が8行目で定義した変数

17行目 C:\example\BunBackup\BunBackup.exe -BACKUP:"C:\example\BunBackup\weekly-backup.lbk" -NORESULT はBunBackupの実行。それぞれのオプションの意味は以下の通り。

オプション 機能
-BACKUP バックアップ実行後、自動でBunBackupを終了
続けて「:"設定名"」で設定ファイルを指定する
-NORESULT バックアップ後、結果を表示しない

ちなみに C:\example\BunBackup\BunBackup.exe -AUTO とだけ指定すると、前回開いたBunBackup設定ファイル(*.lbk)からバックアップを実行する。この場合、BunBackupはバックグラウンドで実行され画面は表示されず、実行後は結果表示もなく自動で終了する。

私は実行中かどうか見てわかるようにしたかったので、画面を表示するようにしている。

23行目 shutdown -s -t 120 はWindowsのシャットダウンコマンド。

オプション 機能
-s シャットダウンする
-t 120 シャットダウンまでの時間を指定する。この場合は120秒

120秒後に強制シャットダウンがかかるけど、中断したい場合は「shutdown -a」を打ち込む。 焦ってコマンドを忘れそうなので、24行目に echo で説明を出すようにした。

最後の cmd.exe -K は、実行後にコマンドプロンプトを自動で閉じないようにするための命令。