*[hatefu:labs.yaneu.com/20090727/] プロジェクトを定期的に自動バックアップしよう

Webに限らず、何かしらのソフトウェアを開発していると、数時間前の状態に戻したいことがある。

Subversionのサーバーでも立てて、定期的にcommitすればいいのだろうけど、私は不精者なので単純にプロジェクトフォルダをzipで圧縮して遠隔にあるftpサーバーにアップロードしている。遠隔にあるサーバーにアップするのは、物理的に離れたところにコピーしないとパソコンごと盗難に遭ったときに困るからである。

* WinRarをコマンドプロンプトで用いる

私はプロジェクトを圧縮するときにはWinRarを用いているのだが、実はWinRarはコマンドプロンプトからも使える。

コマンドプロンプトで次のようにタイプしてみて欲しい。

>>
C:\> "C:\Program Files\WinRAR\rar"
<<

使用できるコマンド一覧が表示されたはずだ。次のように使う。

>>
"C:\Program Files\WinRAR\rar" a -xC:\HogeProject\obj -xC:\HogeProject\bin -r ファイル名.rar C:\HogeProject\*.* 
<<

それぞれの引数の意味は次のようになる。

** aはarchiveに追加を意味する。
** -xは、除外するフォルダの指定。objやbinはバックアップのときはいらないだろう。
** -rはサブフォルダ以下も再帰的に圧縮する
** そのあと圧縮後のファイル名を指定して、最後に圧縮したいフォルダを指定

これでバッチファイルを起動するだけでプロジェクトを圧縮ファイルにすることが出来るようになった。

* WinRarが無い場合は?

WindowsXP以降では標準でzip圧縮を行なう ZIPFLDR.DLL というファイルが含まれているので、これをVBScriptから使用すれば追加のadd-inなど無しにzip圧縮が出来るらしい。(私は動作未確認)

# ZIP.VBS
コマンドラインでZIPファイルを作成/追加/置換/削除/展開/表示するVBScript
http://www.vector.co.jp/soft/winnt/util/se355605.html

* ファイル名を自動的に生成する

私はファイル名に HogeProject200907270250.rar のように日付 + 時刻をファイル名としている。このファイル名に毎回リネームするのが面倒である。これ専用のユーティリティを作ってもいいかも知れないが、実はコマンドプロンプトでこのような名前を自動的に生成することが可能である。

# 参考資料
バッチ・ファイル中で日付をファイル名に使用する
http://www.atmarkit.co.jp/fwin2k/win2ktips/419batchdate/batchdate.html

結論だけ書けば次のようにすれば filename として 20090727030229 と 日付 + 時刻(時分秒)の名前が得られる。

>>
set time2=%time: =0%
set filename=%date:~-10,4%%date:~-5,2%%date:~-2,2%%time2:~0,2%%time2:~3,2%%time2:~6,2%
<<

** '%'から'%'までがひとつのブロック。例えば、「%date:~-10,4%」がひとつのブロック

例えば、秒はいらないという場合は、上の表記の最後の「%time2:~6,2%」を省略すれば良い。

** この書き方まずいんじゃ…?

dateを取得した瞬間に日付が変わってtimeを取得したときに00:00:00だったりすると、前日の00:00:00になったりする気がしなくもないが、滅多に起こるものでもないし、まあいいか…


さて、これを使えば、次のように書ける。

>>
"C:\Program Files\WinRAR\rar" a -xC:\HogeProject\obj -xC:\HogeProject\bin -r X:\HogeProject%filename%.rar C:\HogeProject\*.* 
<<
C:\HogeProject%filename%.rar の %filename% という部分に日付 + 時刻が埋め込まれる。

* 生成されたファイルを別のハードディスクにコピーする

生成されたファイルを別のハードディスクにコピーするのは、単にmoveコマンドで移動させれば良いだろう。

>>
move C:\HogeProject%filename%.rar D:\HogeProjectBackup\
<<

* 生成されたファイルをftpでアップロードする

余り知られていないが、ftpというコマンドがあって、コマンドプロンプトからftpが行なえるのである。

# コマンドプロンプトからftpが使える
ftpコマンド
http://d.hatena.ne.jp/s0u/20070421/1177151436

このftpコマンドは、ID,PASSの認証が必要な場合、次のように事前にどこかファイルに書き出しておき、それを実行してやるようにしなければならない。

>>
set FTPCMD=ftpcmd.txt
del %FTPCMD%
echo [ftpのID名]>> %FTPCMD%
echo [ftpのPASSWORD]>> %FTPCMD%
echo cd HogeProject/backup>> %FTPCMD%
echo put C:\HogeProejct%filename%.rar>> %FTPCMD%
echo quit>> %FTPCMD%
ftp -s:%FTPCMD% [ftpサーバーのドメイン名]
<<

** [ftpのID名],[ftpのPASSWORD]でID,PASSWORDを指定する。直後にスペースが入るとそのスペースまでサーバーに渡されるので、パスワードが異なることになってログインに失敗する。
** [ftpサーバーのドメイン名]は、yaneu.com のように自分の使っているftpサーバーを指定する。

* まとめ

** 以上をバッチファイルに書いて、好きなときに実行すればプロジェクトの圧縮~ftpでのアップロードを自動で行なってくれる。
** タスクスケジューラは、バッチファイルでも登録できるので、タスクスケジューラに登録して定期実行しても良いかも知れない。
** 以下は、今回書いてみたバッチファイル。

>>
set time2=%time: =0%
set filename=%date:~-10,4%%date:~-5,2%%date:~-2,2%%time2:~0,2%%time2:~3,2%%time2:~6,2%
"C:\Program Files\WinRAR\rar" a -xC:\HogeProject\obj -xC:\HogeProject\bin -r X:\HogeProject%filename%.rar C:\HogeProject\*.* 
set FTPCMD=ftpcmd.txt
del %FTPCMD%
echo [ftpのID名]>> %FTPCMD%
echo [ftpのPASSWORD]>> %FTPCMD%
echo cd HogeProject/backup>> %FTPCMD%
echo put C:\HogeProejct%filename%.rar>> %FTPCMD%
echo quit>> %FTPCMD%
ftp -s:%FTPCMD% [ftpサーバーのドメイン名]
move C:\HogeProject%filename%.rar D:\HogeProjectBackup\
del %FTPCMD%
<<

* 更新履歴

2009.07.27 公開