USBメモリーとハードディスクの同期

USBメモリーにハードディスクの一部をコピーして外 出時に持ち歩きたいが、
ドライブレターが自動的に変更されてしまうので面倒く さい。
そこで、ボリュームIDというドライブのシリアル番号 とラベルを登録して
自動的にUSBメモリーを検索して、決められた場所の フォルダを同期するスクリプトを書いてみた。

必要なもの

ドライブID検出ツール(Visual C++.net 2003でのソースコード,Makefile)
Ruby(MSWIN32)
スクリプト本体
RoboCopy.exe(Vistaでは標準で入っているらしい、XP/2000/2003ではリソースキットに付属)

注:
Windows2000のリソースキットは有料の上、既に配布終了しました。
XPもダウンロード可能ではない模様です。
実はWindows2000でもXP でも2003リソースキット内のRoboCopy.exeは単体動作可能です
Windows2003 リソースキットをダウンロードし、そのファイルをWinRARで開いて中身の.msiを抽出します。
この.msiファイルをさらにWinRARで開くと各種コマンドが一個一個直接抽出できます。
こうして実行ファイルの RoboCopy.exeを抽出し、環境変数PATHの掛かっている場所にコピーするだけで使えます
ライセンス的に微妙ですが。

設定の手順

STEP(1):インストール

好きな場所に例えばC:\TOOLSというフォルダを作る。
C:\TOOLSにRoboCopy.exe, drives.exe, usbmir.rbをコピーする。
(すでにリソースキットから導入済みならRoboCopyは改めてコピーせずとも良い)

C:\TOOLSが環境変数PATHに含まれていなければ,
コントロールパネルのシステムの詳細の環境変数のウインドウから登録する。
例:C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem;C:\RUBY\BIN;C:\TOOLS

この次はRubyユーザーなら既に設定済みの可能性が高いが、以下の手順。
C:\>ASSOC .rb=RubyScript
C:\>FTYPE RubyScript=C:\RUBY\BIN\RUBY.EXE -Ks "%%1" %%*
コントロールパネルのシステムの詳細の環境変数で、
PATHEXTに.RBを追加する。
.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.RB

STEP(2):ドライブの調査

drivesコマンドを使ってUSBメモリのIDとボリュームラベルを調べる。
このコマンドを実行すると、その時点で接続されているドライブの情報を全て表示する。

C>drives
C:98F8D9E8:FIXED:NTFS:34876854272/64428584960@SYSTEM
D:888EF018:FIXED:NTFS:27366694912/125830332416@DATA
F:888DC9D9:REMOVABLE:FAT:467632128/513384448@IMATION
Q:00000000:CDROM::0/0@
R:8D643D7E:CDROM:CDFS:0/4512808960@MYCDROM
@マークの後ろにボリュームラベル(付いてなければ@の後ろは空)
ドライブX:の後ろに8桁のIDが表示される

STEP(3):スクリプトに登録

スクリプト本体のusbmir.rbをエディタかメモ帳で開き
変数を設定しておく。
スクリプトの先頭のコメントでも説明しているが、
以下の変数volidにID番号、labelにラベルを入れる(ラベルが無ければ'')
volid = '888DC9D9'
label = 'IMATION'
hddpathにオリジナル側のフルパス、
usbpathにUSBメモリ側のフルパスを入れる
USBメモリーのドライブは変動するので「%s:」と入力する
hddpath = 'D:\SRC\DRIVES'
usbpath = '%s:\DRIVES'

実行のしかた

設定が完璧に終わっていればコマンドプロンプトから
C:\>usbmir
と打ち込むだけで自動的に全て実行され、完了します。
動作確認できたら、ランチャに登録するなど工夫してください。

注:
PSPではメディアが入っていてもシリアル番号がゼロになります。
こういった場合はボリュームラベルをつけて区別して下さい。