robocopyというコマンドを使って、Windowsでタイムスタンプを保持してフォルダまるごとコピーするときの自分用メモです。
基本的な使い方
基本コマンドは以下の通り。(src)と(dst)にはそれぞれコピー元フォルダ、コピー先フォルダを入れてください。
robocopy (src) (dst) /E /COPY:DAT /DCOPY:DAT /r:3 /w:1 /LOG:copy.log /xd "$RECYCLE.BIN" /xd "System Volume Information"
他のオプションの意味は以下の通り。
/E
: 空のディレクトリもコピー/COPY:DAT
: ファイルのデータ、属性、タイムスタンプをコピー/DCOPY:DAT
: ディレクトリのデータ、属性、タイムスタンプをコピー/r:3 /w:1
: コピー不能なファイルがあったとき、3回リトライ。リトライの間隔は1秒。デフォルト値の設定だとリトライが終わらない。/LOG:copy.log
: ログをcopy.logファイルに保存/xd "$RECYCLE.BIN"
: ごみ箱はコピー対象から外す/xd "System Volume Information""
: 隠しシステムフォルダはコピー対象から外す
バッチファイルの名前に関する注意点
robocopy.batというバッチファイルを作って、その中でrobocopyを呼び出すと、robocopyコマンドではなくrobocopy.batが呼び出されてしまうので、無限ループに陥ってしまいます。バッチファイルの名前を変えましょう。
コピー先のフォルダが見えなくなる?
コピー元をドライブ、コピー先をフォルダとすると、なぜかコピー後にコピー先のフォルダが見えなくなる現象が発生しました。以下にそのときの状況を記します。
使ったコマンドは以下です。ここで、 コピー前にはC:\dir1が存在していてC:\dir1\dir2が存在していない状態でした。
robocopy E:\ C:\dir1\dir2 /E /COPY:DAT /DCOPY:DAT /r:3 /w:1 /LOG:copy.log /xd "$RECYCLE.BIN" /xd "System Volume Information"
コピーは行われたのですが、なぜかC:\dir1\dir2フォルダに隠し属性がついていて、エクスプローラーから見えませんでした。恐ろしいことに、エクスプローラーのオプションで「隠しファイル、隠しフォルダー、および隠しドライブを表示する」を有効にしていたとしても、コピー先のフォルダは見えません。エクスプローラーのオプションで「保護されたオペレーティング システム ファイルを表示しない(推奨)」を庵チェックすることでようやくコピー先のフォルダが見えるようになります。
ちなみにCygwinからは何もしなくてもコピー先のフォルダが見えました。
どうも After Robocopy, the copied Directory and Files are not visible on the destination Drive - Stack Overflow で説明されているように、あるドライブのルートを、あるフォルダにコピーしようとしたときに、コピー先のフォルダが見えなくなることがあるようです。
この現象を回避するには、robocopyに
/A-:SH
というオプションをつければOKです。
すでにコピーが終わってしまったあとでも手はあります。コピー先のフォルダに対して
attrib -h -s C:\dir1\dir2
とすれば、隠しフォルダを普通のフォルダに戻せます。