robocopyのXDオプション(除外)にはご注意

robocopyで同期先ディレクトリに同期元ディレクトリが含まれる場合に同期元ディレクトリを同期対象から除外する事でリストアを実現しようとしましたが、
同期元ディレクトリが誤って削除されてしまうトラブルとなってしまったので紹介します。
(除外は複数ディレクトリを指定してみました)

robocopy実行前の状態
e:\>tree /F E:\
フォルダー パスの一覧: ボリューム ボリューム
ボリューム シリアル番号は 3C15-1E7C です
E:\
├─backup
│ └─E
│ ├─a
│ │ aa.txt
│ │
│ ├─b
│ │ bb.txt
│ │
│ └─c
└─backup2
└─E
└─d

e:\>robocopy E:\backup\E E:\ /e /purge /XD “E:\backup\” “E:\backup2\” /copy:dat /r:0 /v /NP /log+:C:\TEMP\filerestore_E_20170406_01.log

ログ ファイル: C:\TEMP\filerestore_E_20170406_01.log

e:\>tree /F E:\
フォルダー パスの一覧: ボリューム ボリューム
ボリューム シリアル番号は 3C15-1E7C です
E:\
├─a
├─b
└─c
コピー元ディレクトリが消えた。末尾の\がエスケープシーケンス扱いになり、E:\backup” として解釈される。
robocopyのログを確認すると、
——————————————————————————-
ROBOCOPY :: Windows の堅牢性の高いファイル コピー
——————————————————————————-

開始: 2017年4月6日 4:18:05
コピー元 : E:\backup\E\
コピー先 : E:\

ファイル: *.*

除外ディレクトリ: E:\backup” E:\backup2″

オプション: *.* /V /S /E /DCOPY:DA /COPY:DAT /PURGE /NP /R:0 /W:30

——————————————————————————
となっている。
正しいコマンドはこちら。

robocopy実行前の状態
e:\>tree /F E:\
フォルダー パスの一覧: ボリューム ボリューム
ボリューム シリアル番号は 3C15-1E7C です
E:\
├─a
│ dd.txt

├─b
├─backup
│ └─E
│ ├─a
│ │ aa.txt
│ │
│ ├─b
│ │ bb.txt
│ │
│ └─c
├─backup2
│ └─E
│ └─d
├─c
└─d

e:\>robocopy E:\backup\E E:\ /e /purge /XD “E:\backup” “E:\backup2” /copy:dat /r:0 /v /NP /log+:C:\TEMP\filerestore_E_20170406_03.log

ログ ファイル: C:\TEMP\filerestore_E_20170406_03.log

e:\>tree /F E:\
フォルダー パスの一覧: ボリューム ボリューム
ボリューム シリアル番号は 3C15-1E7C です
E:\
├─a
│ aa.txt

├─b
│ bb.txt

├─backup
│ └─E
│ ├─a
│ │ aa.txt
│ │
│ ├─b
│ │ bb.txt
│ │
│ └─c
├─backup2
│ └─E
│ └─d
└─c

e:\>
想定通りの動きとなりました。

robocopyのログの最終15行のみ確認したい場合はpowershellを使います。

e:\>powershell “Get-Content C:\TEMP\filerestore_E_20170406_03.log| Select-Object -last 15”
*EXTRA File 0 dd.txt
新しいファイル 0 aa.txt
1 E:\backup\E\b\
新しいファイル 0 bb.txt
0 E:\backup\E\c\

——————————————————————————

合計 コピー済み スキップ 不一致 失敗 Extras
ディレクトリ: 4 0 0 0 0 5
ファイル: 2 2 0 0 0 2
バイト: 0 0 0 0 0 129
時刻: 0:00:00 0:00:00 0:00:00 0:00:00
終了: 2017年4月6日 4:23:58
Extrasはコピー元に無く、コピー先にあるディレクトリ,ファイルの数という意味で
上記の例だと
E:\backup,E:\backup2,E:\dの3がカウントされるはずですが、5となっています。

ログを確認してみると
名前の付いたディレクトリ -1 E:\backup\
名前の付いたディレクトリ -1 E:\backup2\
*EXTRA Dir -1 E:\$RECYCLE.BIN\
*EXTRA Dir -1 E:\$RECYCLE.BIN\S-1-5-21-375080097-2867646673-169512704-500\
*EXTRA File 129 desktop.ini
*EXTRA Dir -1 E:\d\
となっており、隠しディレクトリのゴミ箱がカウントされていた事がわかりました。
ドライブ直下の場合は注意が必要ですね。

Comments are closed.