自宅のPCとレンタルサーバのバックアップを取るためのバッチを書いた。ほぼ自分専用のメモ。
今まではBunBackupを使って3日に1回、定時にバックアップを走らせていたが、自分がPCを使うタイミングが不定期すぎて、バックアップが取れないことが増えてきた。
そこで、BIOS使って夜中にPCを自動起動させ、バッチでバックアップ作業をやらせることにした。ついでにレンタルサーバで動かしてるWebサイトのデータもバックアップする。以下のような流れ。
- 週に一度、真夜中にPCを自動起動させる
- WinSCPでレンタルサーバの中身をNASにバックアップする
- BunBackupでPCのデータをNASにバックアップする
- 自動で電源を切る
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
は、実行後にコマンドプロンプトを自動で閉じないようにするための命令。
コメント