はじめに
みなさんこんにちは、横Tです!
前回「robocopyを試してみた!(基本編)」の記事を書きました。今回はその続きとなる「実践編」です!
実践編では「すべてのデータをコピー」する場合と「定期的にバックアップ(コピー)」する場合の観点で、詳しく見ていきたいと思います!それではさっそく本編に入りましょう!
すべてのデータをコピーする準備
また、すべての”データ”というのはどういう意味でしょうか?
まず、すべてのデータをコピーしたい場合としては
①パソコンを入れ替える場合
②ファイルサーバを入れ替える場合 ※情報システム部門の人たちなど
の2つがよくあるのではないかなと思います。
①の場合は、1台のパソコンになるので数十GBほどであれば、1日かけて手動でコピペするのもいいかと思いますが、数百GBとなる場合にはrobocopyを使用するのもいいかもしれません。
②の場合は、何人もの人と共有して使用することになるので、容量は場合によっては数TB~数十TBとなり、コピペはもはや現実的ではありません。
私も実際にお仕事で数十TBのデータ移行にrobocopyを使用したこともあります。
次に、すべての”データ“ですが、ファイルがそこに存在さえしていればすべてコピーできていると言っていいのでしょうか?
百閒は一見に如かずということで、実際に見てみましょう!
適当なファイルを右クリックしてプロパティを選択します。

表示されたプロパティ画面の”セキュリティ”タブを開きます。

見たことがない人はなんのことかわからないと思いますので簡単に説明すると、
赤枠が、このファイルに対して何かしら権限が設定されているユーザ/グループ、
青枠が、それぞれに設定されている権限です。
一言でいうと、「誰がアクセスできて、どんな操作ができるかを設定している」情報です。(画像は”Users”に対して設定されている権限)
このデータ(情報)もコピーしなくてはならないため、ファイルがあるだけではすべてコピーできているとは言えないのです!
他にはファイルの属性やタイムスタンプなども”データ“に含まれてきます。
すべてのデータをコピーする
実行コマンド |
robocopy <コピー元> <コピー先> /COPYALL /MIR /EFSRAW /ZB /NP /V /R:1 /W:1 /IT /LOG+:<保存先> |
たくさんオプションを付けていますが、1つ1つ説明していきます。
・/COPYALL
「すべてのデータをコピーする」という条件おいては一番重要になってくるオプションになるかと思います。 「/COPY:DATSOU」と同等のコマンドとなり、単純なデータだけでなく付随するデータもコピー対象としてコピーしてくれます。この「DATSOU」の意味は以下のようになっています。
D=データ、A=属性、T=タイムスタンプ、S=セキュリティ、O=所有者情報、U=監査情報
・/MIR
ディレクトリツリーをミラー化してくれるオプション。ミラー化というのは、例えばコピー元で新しく作成されたファイルをコピーするだけではなく、 削除されたファイルがあればコピー先でも同様に削除し、コピー元とコピー先を同じ状態にしてくれます。 なお、/MIRは「/E」と「/PURGE」を合わせたオプションとなっています。
「/E」・・・空のディレクトリを含むサブディレクトリもコピーする
「/PURGE」・・・既にコピー元に存在しないコピー先のファイル/ディレクトリを削除する
・/EFSRAW
WindowsのEFSという暗号化機能を使って暗号化しているファイルがある場合にはESF RAWモードという形でコピーしてくれます。 本来、暗号化されているファイルには他の人がアクセスできないようになっていたりするので、このオプションを付けることで コピーできるようにします。
・/ZB
元々「/Z」「/B」というオプションがあり、それを1つにまとめたオプションです。 「/Z」では再起動可能モードでファイルをコピーするようにし、「/B」ではバックアップモードでファイルをコピーするようにします。 この再起動可能モードというのは、もし何かしらの原因で中断した場合でも途中から再開してくれるようになるので 大きなファイルや大量のデータがある場合には付けておくといいですね。
バックアップモードというのは、簡単に言うとアクセス権が無いファイルでもコピーできるようにします。こちらもすべてをコピーする場合には必須と言っていいですね。
・/NP
コピーの完了率を非表示にします。「逆にあった方がいいのでは?」と思われるかもしれませんが「/LOG:」オプションを付ける際には必須です! 付け忘れるとただひたすら進捗率(0%とか)がたくさん記載されたログとなってしまうのでとても見れるようなログにはなりません。。
コマンドプロンプト上で結果を出力して確認する、という場合はなくても問題はありません。
・/V
すでにコピー先に同様のファイルがある場合はスキップ処理を行いますが、スキップされたファイルがわかるように 出力できるようにします。もしこのオプションが無かった場合にはスキップされたファイルはログ上に残らず、スキップされたファイルのカウント数のみが最後に残りますが、後でログを見直す際にはあった方が分かりやすくなります。
・/R:1
何かしらの原因でコピーできなかった際の試行回数を指定しています。「別に失敗したらそれはそれでいいよ」という人でもこのオプションは付けてください。 実はこのオプション、robocopy実行時にはデフォルトで設定されており、その設定値は脅威の1000000回!
そのためこのオプションはrobocopyを使用する際は必須で指定しておくのがいいでしょう。 今回は試行回数として「1」を指定していますが、状況や条件によって回数は変更してください。
・/W:1
こちらは再試行と再試行の間に待機する時間を指定します。単位は「秒」です。 これも「/R」と同様にデフォルトで設定されている値があり、 30秒がデフォルト値となっています。 勘のいい人はお気付きかもしれませんが、もし「/R」と「/W」を指定せずデフォルトのまま実行して、1ファイルでもアクセス拒否等で失敗した場合は
1000000回×30秒=30000000秒(約347日)
という時間をかけて試行を行い、次のファイルコピーに移ることになります。 1ファイルに1年近くの時間をかけるわけにはいかないのでこれらのオプションは要件に関わらず必須と言えるでしょう。
・/IT
異常なファイルも含めるようになります。と、ヘルプには記載されているのですが、そもそも異常なファイルというのは ファイルが破損している等のことを指しているわけではありません。 robocopyはファイルの更新日時とサイズを見て差分判定を行いますが、ファイル属性のみを変更した場合でも コピー対象としてくれるようになります。その際「マイナー変更した」という ステータスでログされます。ログ上ではマイナスな表現になっていますがエラーではないですよー。
かなり文字の量が多くなってしましましたが、以上が今回使用するオプションの説明でした。一通り説明をしたオプションを付けて実行することで、基本的にはすべてのデータをコピーすることができるかと思います! ただし、エラーとなりコピーできていないファイルがある場合は別途対応を検討する必要がありますのでご注意ください…。
次は定期的にバックアップする方法について見ていきましょう!
定期的にバックアップ(コピー)する
注意 robocopyでは製品を使用したバックアップほど細かいことはできません。 ・世代管理は基本出来ない ・誤って削除してしまった場合は救えるが、誤った”更新”は救えない。 一時的な対応や小規模環境など、条件に応じて判断して運用してください。 しっかりとしたバックアップが必要な場合は製品の購入を検討することをオススメします。 |
実はバックアップの場合でも実行コマンドは「すべてのデータをコピーする」場合とほとんど変更しなくても問題ありません。 要件によりますが、コピー先のデータを削除されないよう「/MIR」を「/E」に変えることでコピー元でファイル削除したとしてもコピー先のファイルをずっと残すことも可能です。※残り続けるためコピー先のディスク容量には注意が必要です。
なので、後は定期的に実行するにはどうするかですが、それには「コマンドのbat化」と「タスクスケジューラー登録」で実現します!
・コマンドのbat化
これはそこまで難しくありません。上記で説明したコマンドをtxtに記載し、ファイル拡張子をbatで保存するだけで終わりです。 基本編の環境をそのまま利用して実際に見ていきましょう。
コマンドをtxtに記述して保存します。
※保存先はどこでもいいですが、管理しやすい場所にしておきます。

ファイル拡張子を「txt」から「bat」に変更します。(警告が出ますが”はい”で大丈夫です)

これでbat化は完了です。
・タスクスケジューラーの登録
次にこのbat化したファイルをタスクスケジューラーに登録します。 環境によって細かい部分は変わるかと思いますが、今回は以下の条件で登録します。
タスク実行ユーザー | Administrator |
実行間隔 | 1日1回、0時開始 |
タスク停止までの時間 | 無効 |
既にタスク実行中の場合 | 新しいインスタンス(タスク)を実行しない |
タスク実行時のプライオリティ | 通常(6) |
「タスクスケジューラーライブラリ」を右クリックし「タスクの作成」を選択

“全般”タブで以下のように設定していきます。
タスク実行ユーザー | Administrator |
実行間隔 | 1日1回、0時開始 |
名前 | robocopy |
説明 | robocopyの実行※記載しなくても問題ありません。 |
実行ユーザアカウント | Administrator |
ユーザログオン状況 | ログオンしてなくても実行する |
最上位の特権 | 有効 |
構成 | タスクを登録する環境に合わせる |
合わせます。そのため、ローカルで実行する場合にはあまり考慮する必要はありません。

“トリガー”タブで新規を選択

設定を「毎日」にし、開始時間を指定します。

“操作”タブで新規を選択

参照を選択し、先ほど作成したbatを選択します。

“条件”タブで以下のように設定していきます。
AC電源を使用している場合のみ… | チェックを外す |
電源をバッテリに切り替得る場合 | チェックを外す |
スリープの解除 | チェックを付ける |

“設定”タブで以下のように設定してOKをクリックします。
タスク停止するまでの時間 | チェックを外す |
要求時に実行中のタスクが… | チェックを外す |
タスクが既に実行中の場合 | 新しいインスタンスを開始しない |

作成したタスクを右クリックし、エクスポートを選択します。

エクスポートしたxmlファイルをメモ帳で開き、プライオリティを7から6に変更して保存します。
これしないとタスクスケジューラーによって実行されるプログラムの優先度が低く、実行しても「あれ、処理が遅いな。。。」という事態を回避できます。
詳しくはTaskSettings. Priority プロパティをご確認ください。

最初に作成していたタスクを削除します。

タスクスケジューラーライブラリを右クリックし、タスクのインポートから編集したxmlファイルを選択します。


タスクが準備完了ステータスになっていることを確認する。

これにてタスクの登録は完了です。これで毎日0時に自動でrobocopyを実行することができます!
ちなみに、すべてのデータをコピーするコマンドを同じように登録して毎日実行した場合、差分コピーとして機能しますので ぜひ試してみてください!
まとめ
robocopyはライセンス費用をかけることなく使用できるので、存在さえ覚えておけばいざというときにきっと役立ちます!
それでは最後にポイントのおさらいです!
・すべての”データ”というのはファイルだけでなく権限、属性、タイムスタンプ等も含んでいる。
・robocopyのオプションはどんな時でも共通して「/ZB」「/R」「/W」オプションは必ず付ける!
・定期実行するためには「コマンドのbat化」と「タスクスケジューラー」を利用する!
今回紹介したオプションは数ある中の一部なので、ぜひ色々なオプションを試してrobocopy使いになってください! 次はなんの記事を書こうかな~。