2007年12月24日月曜日

robocopyで同期を取る

robocopyという、vistaから標準搭載、それより前のwindowsはツールキットの入手で使用可能なコピーツールのお話。

フォルダの同期を取るのに非常に重宝すると云うことだったので、納品システムとして使ってみることにした。

予定シナリオは
ファイルサーバ→ローカルPC→外付けHDD
の段階を踏んで、納品データをファイルサーバからサルベージ、ローカルPCに落とし込んで、外付けHDDに保存し、これを納品。

以下使用バッチファイルをそのまま。

--------------------------------

IF NOT EXIST \\192.168.1.XXX\server_directory GOTO firstEND
robocopy \\192.168.1.XXX\server_directory E:\LOCAL\NOUHIN /e /purge /R:2 /W:1 /Z >> E:\LOCAL\%DATE:~0,4%-%DATE:~5,2%-%DATE:~8,2%transfer.log
:firstEND
IF NOT EXIST F:\ GOTO secondEND
robocopy E:\LOCAL\NOUHIN F:\NOUHIN /e /purge /R:2 /W:1 /Z >> F:\%DATE:~0,4%-%DATE:~5,2%-%DATE:~8,2%external_transfer.log
:secondEND

--------------------------------
1行目「IF NOT EXIST ~ GOTOは、サーバの接続状況を調べるため。サーバに接続されていなかったらgoto以下の所に飛びます。
2行目がrobocopy。コピー元 コピー先 オプション リダイレクトでログを取ってます。
3行目はgoto文の終了場所。
4行目は1行目と同じgoto文。外付けハードディスクFの確認。
5行目は2行目と同じ。
6行目で終了。

参考サイトで上げた所に書いてあった「バッチファイル(コマンドラインで)今日の日付フォルダ(ファイル)を作る方法」覚え書き

Tips2 ファイルを整理する際に重宝する
日付ごとにフォルダやファイルを作る方法

 本連載のテーマは、基本的には「データの同期による冗長化」だが、場合によっては日付ごとにフォルダを作ってファイルを整理する必要が生じるかもしれない。こうした方法でデータをコピーしておけば、過去のファイルに簡単にさかのぼれるからだ。

 バッチファイルで日付の情報を利用するには、その日の日付を取得する手段が必要になる。Windowsでは環境変数「DATE」で日付を、環境変数「TIME」で時刻をセットするので、それぞれ「%DATE%」「%TIME%」と記述することで呼び出せる。

 ただし環境変数DATEは既定値の表示形式が「yyyy/mm/dd」形式になっているので、例えば「MD %DATE%」として日付と同名のフォルダを作ろうとすると、「/」はフォルダ名に使用できないため、エラーになってしまう。また、 Windows2000では、日付の左側にスペースを挟んで曜日の表記が加わるので、さらに話が難しくなる。

 そこで、環境変数の中から任意の位置の文字を抽出する機能を併用して、「yyyy/mm/dd」形式を「yyyy-mm-dd」形式に変換して利用する方法を説明しよう。WindowsXP用の記述とWindows2000用の記述は、それぞれ次のとおりだ。WindowsXPと Windows2000で方法が異なるのは、Windows2000では曜日の表示が加わって「火 2006/1/17」という表記になるからだ。

・WindowsXPの場合
%DATE:~0,4%-%DATE:~5,2%-%DATE:~8,2%

・Windows2000の場合
%DATE:~2,4%-%DATE:~7,2%-%DATE:~10,2%

 この記述方法について少し説明しておこう。「%DATE:~」に続いて「<開始位置>,<文字数>%」と記述することで、指定した文字列を抜き出している。つまり「%DATE:~0,4%」は、日付から0番目から4文字の文字列を抜き出している。なお、先頭の文字に対応する開始位置指定が「1」ではなく「0」になる点に注意してほしい。

 区切り文字として使用する「-」や、ファイル名に使用するそのほかの文字、拡張子などについては、そのまま記述すればよい。

 こうした記述を行えば、日付、あるいは時刻を動的に変化させながらフォルダやファイルを作成できる。例えば、日付と同名のフォルダを「J:\」以下に作成して、「C:\Test」の内容をコピーしたい場合は、バッチファイルには次のように記述する。

MD J:\%DATE:~0,4%-%DATE:~5,2%-%DATE:~8,2%
ROBOCOPY "C:\Test" "J:\%DATE:~0,4%-%DATE:~5,2%-%DATE:~8,2%" /S /V /MIR 

 一方、時刻に対応する環境変数TIMEは、「hh:mm:ss.ss」という形式でコンマ秒の単位まで表示する。こちらはフォルダやファイルの名前に使用できない文字を含んでいないので、そのまま利用できる。コンマ秒単位までは必要ないという場合は、先と同様の手法で先頭から8文字だけ切り出せばよい。記述方法は「%TIME:~0,8%」となる。こちらはWindows2000/XPともに共通だ。


リダイレクトしたログファイルはかなり巨大になるけれども、何があったか把握できるので便利。
使用オプションは

--------------------------------
/e 全てのサブフォルダを含む
/purge 送り側で削除されたファイル/フォルダは、受け側でも削除する
/R:2 再試行回数。
/W:1 待ち時間(秒)
/Z 途中で止めても再開出来るようにしてくれる

--------------------------------

再試行回数制御(/R:n)←nは数字)は、指定しておかないと非道い目に遭う。
同じく、再試行待ち時間(/W:n)も。

参考サイトは
http://www.atmarkit.co.jp/fwin2k/win2ktips/877robomir/robomir.html
http://www.rimesene.co.jp/mesene/tips/contents/zd063.htm
http://www.microsoft.com/japan/technet/windowsserver/2008/library/d4c6e8e9-fcb3-4a4a-9d04-2d8c367b6354.mspx?mfr=true
http://mediawithms.spaces.live.com/blog/cns!BE8B403EF3C6D5A6!167.entry
http://www.windows-world.jp/special/-/60009.html

0 件のコメント:

コメントを投稿