【robocopy】Windows のデータをコマンドで移行する

スポンサーリンク

Windows には標準で robocopy というデータコピー専用のコマンドがあります。データ移行をする際に注意すべきは下記 2点になります。

  • ファイルとフォルダをもれなく移行する
  • ファイルとフォルダの付加情報も正しく移行する

上記を踏まえて、robocopy コマンドでドライブ間のデータを丸ごと移行する方法を解説したいと思います。

TEST

1. データを移行するコマンド

Cドライブのデータの丸ごとコピーは robocopy コマンドではできません。バックアップ/リストアによる方法を検討ください。

1.1. おすすめオプション

robocopy には色々なオプションがありますが、結論をお伝えすると下記のオプションを含めたコマンドをおすすめします。

おすすめのオプション

robocopy <コピー元> <コピー先> /MIR /DCOPY:DAT /COPYALL /IM /IT /XD "System Volume Information" "`$RECYCLE.BIN" /R:0 /LOG+:<ログファイルの出力先>

コピー元ドライブに存在しないフォルダやファイルがコピー先に存在する場合、コピー先に存在するファイルとフォルダは削除されますので十分にご注意ください。

実行例

D ドライブのデータを E ドライブに丸ごと移行する際のコマンドの実行例です。
※コマンドを実行するときはコマンドプロンプトを管理者権限で起動してください

robocopy D: E: /MIR /DCOPY:DAT /COPYALL /IM /IT /XD "System Volume Information" "`$RECYCLE.BIN" /R:0 /LOG+:C:\robocopy.log

コマンドのオプションについては順番に解説していきます。

1.2. オプション解説

No.オプション説明
1/MIRコピー元ドライブのデータをコピー先ドライブにすべてコピーします。
robocopy D: E: の場合は Dドライブのデータをすべて、E ドライブにコピーします。
2/DCOPY:DATディレクトリをコピーする際に合わせてコピーする情報を指定します。
D : データ
A : 属性
T : タイムスタンプ
※このオプションを明示的に指定しない場合は /DCOPY:DA 扱いとなりタイムスタンプがコピーされません。
3/COPYALL/COPY オプションでファイルをコピーする際に合わせてコピーする情報を指定します。
D : データ
A : 属性
T : タイムスタンプ
S : セキュリティ(アクセス許可情報)
O : 所有者情報
U : 監査情報

/COPYALL を指定すると /COPY:DATSOU と同じすべての情報をコピーします。
※このオプションを明示的に指定しない場合は /COPY:DAT 扱いとなりセキュリティ情報、所有者情報、監査情報がコピーされません。
4/IM※このオプションは Windows Server 2016 以降で利用できます
Windows は ファイルの内容を書き換えた場合に更新される更新時刻(エクスプローラーで確認できる更新時刻)のほかに、 MFT (Master File Table) と呼ばれる領域が更新された場合にも更新時刻を管理しています。この更新時刻はエクスプローラーで確認できる更新時刻とは異なります。
ファイル名やファイルの属性、セキュリティ情報が変更されるとMFTのタイムスタンプも更新されます。/IM オプションによりMFTタイムスタンプが更新された場合もコピーの対象に含めており、セキュリティ情報などの付加情報が変更された場合でも同期の対象となるようにしています。
※1回限りのコピーをおこなう場合は不要なオプションではありますが、つけておいても害はありません。2回目以降に差分同期をする目的で、robocopy を再実行した際に真価を発揮するオプションです。
/COPYALL オプションを付加すると自動的に/IM オプションも有効になりますが、今回の例では、あえて明示的に付加しています。
5/ITコピー元とコピー先でサイズも更新情報が同じだが属性情報が異なる場合、異常なファイル(Tweaked)として分類されます。この属性情報のみが更新されたファイルの取りこぼしを防ぐ目的で /IT オプションを付加します。/IM と同様に初回のコピーでは不要なオプションとなりますが、つけておいても害はありません。
※このオプションをつけ忘れたとしても問題になることは少ないでしょう。
6/XD不要なディレクトリを除外するオプションです。
下記の2つのディレクトリはコピー不要のため、除外しています。
System Volume Information : Windowsの復元ポイントなどのデータが格納されるディレクトリです。ドライブ固有の情報なのでコピー不要です。
※コピーしようとしてもコピーできません。
$Recycle.Bin : ゴミ箱です。ゴミ箱はドライブごとに用意されており、コピー不要ですので除外しています。
※ゴミ箱を除外する場合は “`$RECYCLE.BIN” のようにバッククオテーション(`) を $ の前に付加するようにしてください。
※ここで除外したファイルは実行結果のスキップされた数に含まれます
7/R:/R: はリトライ回数を指定するオプションです。コピーできないファイルがあった場合は指定した回数分リトライをします。デフォルトだと100万回リトライするので、このオプションは必ず指定してください。
今回の例では /R:0 とし、リトライしない設定にしています。
コピーの失敗は Windows のサービスがファイルを利用していることが原因である場合が大半です。1度失敗したファイルはリトライをしても失敗するので、リトライはしない設定で良いでしょう。コピーに失敗したファイルがあるかどうかは、ログを見て判断してください。
8/LOG+:コマンドの実行結果を追記します。
下記のように指定すると Cドライブ直下にrobocopy.log というファイルが作成されます。
/LOG+:C:\robocopy.log
コピーに失敗したファイルがあるかどうかを確認するためにも、ログを取得することをお勧めします。

2. 補足

補足 1

robocopy でデータをコピーする前に対象ドライブにアクセスする可能性のあるサービスは停止するようにしましょう。例えば SQLSever のデータベースファイルは「SQL Server] サービスが起動したままだとコピーに失敗します。各種サービスはサービス一覧から停止できます。
※参考:「サービス一覧」の開き方

補足2

ドライブ間でデータコピーをおこなうと、スキップされたディレクトリが +1 されますがこれは問題ありません。下記の例では System Volume Information$Recycle.Bin の 2つのディレクトリを除外していますが、スキップされたディレクトリが 3 になっています。

これはコピー先の親フォルダ(上記の例では Fドライブ)がすでに存在するため、スキップされていることを示しています。

少し分かりづらいので、次の例で考えてみましょう。

robocopy E:\test F:test /MIR /DCOPY:DAT /COPYALL /IM /IT /XD "System Volume Information" "`$RECYCLE.BIN" /R:0 /LOG+:C:\robocopy.log

E:\test フォルダの中身を F:\test にコピーするコマンドですが、F ドライブ配下に test フォルダが存在しなければ作成しますが、存在する場合は作成不要なので、スキップされます。ドライブの場合も同じように考えてみてください。コピー先がドライブ直下の場合は、コピー先のディレクトリが存在しないことはないので、必ずスキップされます。

<参考サイト>

コメント

このページは「広告ブロッカー」を使っている人だけに表示される隠しページです。
ここにたどり着いたあなたには特別に当サイトのおすすめ書籍を紹介します。

当サイトのおすすめ書籍ランキング

第5位 達人プログラマー

第4位 マスタリングTCP/IP 入門編

第3位 ネットワークはなぜつながるのか

第2位 リーダブルコード

第1位 プログラムはなぜ動くのか