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

スポンサーリンク

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

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

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

TEST

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

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

1.1. おすすめオプション

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

おすすめのオプション

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

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

実行例

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

robocopy D:\ E:\ /MIR /DCOPY:DAT /COPYALL /IM /IT /B /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/Bバックアップモードでコピーを実行します。バックアップモードとはフォルダやファイルの権限を無視して、アクセスすることを可能にするモードです。
権限の問題でファイルやフォルダのコピーが失敗してしまうのを防ぐ目的でこのオプションを指定します。
※「エラー5 (0x00000005) ファイルをコピーしています。アクセスが拒否されました。」のメッセージが表示されてコピーに失敗します。
※Administrators に所属するユーザーでも、アクセスできないファイルやフォルダが存在する場合があります。/B オプションをつけることで権限によるコピー失敗を回避できます。
/B オプションを有効にするためには Administrators グループもしくは Backup Operators に所属するユーザーでrobocopyを実行する必要があります。
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. 実行ユーザー

実行ユーザーは Administrators もしくは Backup Operators に所属するユーザーを利用してください。

タスクスケジューラから実行する場合は SYSTEM ユーザーの利用をおすすめします。Administrators グループには存在しませんが、管理者権限を保有しているため バックアップモードでも利用できます。SYSTEM ユーザーにはパスワードが存在しないためパスワード変更によるタスク実行失敗を防ぐことができます。

3. タスクスケジューラから Robocopy を実行する

1. 下記のようなバッチファイルを作成します。
※下記の例ではログファイルの末尾にコマンドの実行の日付(YYMMDD)を付加するようにしています。

SET YYYYMMDD=%date:~0,4%%date:~5,2%%date:~8,2%

robocopy D:\test1 F:\test1 /MIR /DCOPY:DAT /COPYALL /IM /IT /XD /B "System Volume Information" "`$RECYCLE.BIN" /R:0 /LOG+:C:\robocopy_%YYYYMMDD%.log
robocopy D:\test2 F:\test2 /MIR /DCOPY:DAT /COPYALL /IM /IT /XD /B "System Volume Information" "`$RECYCLE.BIN" /R:0 /LOG+:C:\robocopy_%YYYYMMDD%.log

2. 任意の場所に作成したバッチファイルを配置します。

ファイル名は robocopy.bat 以外にしてください。コマンド名と同じファイル名にすろとコマンドの実行に失敗します。

3. タスクスケジューラを起動します。
参考:「タスクスケジューラ」の開き方

4.「タスクの作成」をクリックします。

5.「全般」タブで「ユーザーまたはグループの変更」をクリックします。

6. 下記の通り指定してOKをクリックします。

  • 場所の指定: ログインしているWindowsのホスト名
  • オブジェクト名: SYSTEM ※他のユーザーでもかまいません

7. 下記の通り指定します。

  • 名前: 任意のタスク名
  • 最上位の特権で実行する: チェック

8.「トリガー」タブを選択し「新規」をクリックします。

9. 任意のスケジュールを設定し「OK」をクリックします。

10.「操作」タブを選択し「新規」をクリックします。

11. 作成したバッチファイルを指定し「OK」をクリックします。

12.「OK」をクリックします。

以上。

4. robocopy の実行結果について

robocopy コマンドを実行すると実行結果の最後に下記のようなサマリが表示されます。

  • コピー済み: コピーを実施したディレクトリとファイルの数
  • スキップ: すでにコピー先に存在するためコピーされなかったディレクトリとファイルの数
  • 不一致:
  • 失敗: 何らかの理由でコピーできなかったファイルの数
  • Extras: コピー元にはなく、コピー先にみに存在していたファイルの数
------------------------------------------------------------------------------

	                   2	D:\Data\

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

                  合計     コピー済み      スキップ       不一致        失敗    Extras
   ディレクトリ:         1         0         1         0         0         0
     ファイル:         10         2         8         0         0         1
      バイト:        24         0        24         0         0         0
       時刻:   0:00:00   0:00:00                       0:00:00   0:00:00
   終了: 2023年10月1日 22:32:00

4. robocopy のリターンコードについて

下記はMSの公式サイトで公開されている Robocopy のリターンコードです。0~7は成功、8以上は失敗となります。リターンコードで成否を判断する場合は下表を参照してください。

ValueDescription
0No files were copied. No failure was met. No files were mismatched. The files already exist in the destination directory; so the copy operation was skipped.
ファイルはコピーされませんでした。 エラーは発生しませんでした。 ファイルの不一致は発生しませんでした。 ファイルがコピー先ディレクトリに既に存在するため、コピー操作はスキップされました。
1All files were copied successfully.
すべてのファイルが正常にコピーされました。
2There are some additional files in the destination directory that aren’t present in the source directory. No files were copied.
コピー先のディレクトリにコピー元に存在しないファイルがあります。ファイルはコピーされませんでした。
3Some files were copied. Additional files were present. No failure was met.
一部のファイルがコピーされました。追加のファイルが存在していました。エラーは発生しませんでした。
5Some files were copied. Some files were mismatched. No failure was met.
一部のファイルがコピーされました。一部のファイルは一致しませんでした。エラーは発生しませんでした。
6Additional files and mismatched files exist. No files were copied and no failures were met. Which means that the files already exist in the destination directory.
追加のファイルと一致しないファイルが存在します。ファイルはコピーされず、エラーも発生しませんでした。これは、ファイルがすでに宛先ディレクトリに存在していることを意味します。
7Files were copied, a file mismatch was present, and additional files were present.
ファイルがコピーされ、ファイルの不一致もあり、追加のファイルも存在しました。
8Several files didn’t copy.
いくつかのファイルはコピーされませんでした。
出典: Return codes that are used by the Robocopy utility in Windows Server 2008 or Windows Server 2008 R2

※MSのサイトはリンク切れになることが多いので、スクリーンショットを貼り付けておきます。クリックで拡大します。

Return codes that are used by the Robocopy utility in Windows Server 2008 or Windows Server 2008 R2

出典: Return codes that are used by the Robocopy utility in Windows Server 2008 or Windows Server 2008 R2

4. 補足

補足 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 フォルダが存在しなければ作成しますが、存在する場合は作成不要なので、スキップされます。ドライブの場合も同じように考えてみてください。コピー先がドライブ直下の場合は、コピー先のディレクトリが存在しないことはないので、必ずスキップされます。

<参考サイト>

コメント