robocopyを試してみた!(基本編)

robocopyを試してみた!(基本編)

with コメントはまだありません

はじめに

みなさんこんにちは、横Tです!
今回は、Windows標準機能としてある「robocopy」について、記事にしていきたいと思います!
記事は「基本編」「実践編」の2本立てでお送りいたします!
この記事は1つ目の記事となる「基本編」となりますので、robocopyを使ったことが無いという人にも、できる限りわかりやすく書きたいと思いますので、ぜひ最後まで読んでいってください!

robocopyとは?

そもそも「robocopy」とは何なのか?
一言でいうと「データをコピー」してくれるツールです。すごくシンプルですねー。
ちなみに、マイクロソフトさん公式にも「ファイルのデータをコピーします。」とだけ記載されています。(笑)
これを聞いて「なんだ。ただコピーしてくれるだけか。」と思われる方もいるかもしれませんが、シンプルな説明に反してrobocopyには豊富なオプションがついており、使い方や使う場面によってはとっても有用なツールとなります!
例えば、皆さんがコピーする場面とはどういう場合があるでしょうか?

 今あるフォルダから別のフォルダにコピーしたい。
 ファイル編集前にバックアップとしてオリジナルのファイルを残したい。
 データをすべてコピーしたい。
 定期的にファイルのバックアップを残したい。

おそらくの場面で使用する方が多いかと思いますが、この場合は手動で行ういわゆるコピペでも問題ないでしょう。
それではの場合はどうでしょうか。
「別にコピペでいいじゃん!」と思われるかもしれませんが、それぞれ”データをすべて”、”定期的に”という条件が付いていますね。
これを実現するのにコピペだけでは実現は難しいと思いませんか?
ファイルがすべてコピーされたか1つ1つ確認するのも、定期的にバックアップを取るのも、どちらも手動で行うにはあまり現実的ではありません。
そこで登場するのがこの「robocopy」なのです!

robocopyの使い方

なんとなくrobocopyがどんなツールで、どんな時に使うのか分かったところで、実際にどのように使うのか見てみましょう。
なお、このrobocopyツールは、Windows Server OSだけでなく、PC OSにも標準でインストールされていますので、Windows OSであれば使うことができます!

まずはコマンドプロンプトを立ち上げて、「robocopy /?」というコマンドを実行します。
※今Windowsパソコンで見ている人は実際に試してみてね!

コマンドプロンプトを立ち上げます。(画像は結果の一部分となります。)
コマンドプロンプト立ち上げ
コマンドプロンプト起動

「robocopy /?」というコマンドを実行します。(画像は結果の一部分となります。)
※ 画像の下にある 実行/戻す ボタンを押してみてください!
robocopyヘルプコマンド実行前
robocopyヘルプコマンド実行前



実際に実行された方は、たくさんの文字が出てびっくりしたかもしれませんが、これで表示できるのはrobocopyの使い方とオプションの一覧となります。 robocopyはコマンドによって実行するツールのため、コマンドプロンプト上での操作が基本となります。

robocopyを使うための基本コマンドは以下の形式です。
※オプションは数が非常に多いので「基本編」での説明は割愛させていただきます。。。
コマンド形式
robocopy <コピー元> <コピー先> <ファイル名>


それではコマンドの使い方を確認できたところで実際に使用していきましょう!
今回は以下のような環境で検証を行っていきます。
端末 Windows 10 Pro
コピー元 C:\Source
コピー先 C:\Destnation
ファイル名 テスト.txt
ログ保存先 C:\robocopylog\
ログファイル名 robocopy_log.txt

コピー元となるSourceフォルダにテスト用の「テスト.txt」ファイルを作成します。
Sourceフォルダ空
Sourceフォルダ、テストファイル作成 テキストファイルを作成


コマンドプロンプトにて「dir C:\Source」というコマンドで、先ほど作成したテストファイルが確認します。 また、「dir C:\Destnation」でコピー先のフォルダには何もないことも確認できます。
dirコマンド実行
dirコマンド実行


先ほどのコマンド形式に実際の値を当てはめて実行してみます。
実行コマンド
robocopy C:\Source C:\Destnation テスト.txt

robocopy実行前
robocopy実行前



実行結果として先ほどのテストファイルがコピーされて、結果として「コピー済み」項目のファイルで”1″がカウントされました。ディレクトリは「C:\Source」の分で、コピー対象外のため「スキップ」項目でカウントされていることがわかります。

次は再度「dir」コマンドを実行してファイルがコピーされたか実際に確認してみます。
dirコマンド実行後確認
コピーされたかdirコマンドで確認
無事ファイルがコピーされていますね!
いかがでしょうか?これがrobocopyを使用した基本的なコピーとなります。
次はちょっとした条件を加えた場合の挙動を見ていきましょう!

robocopyの挙動

robocopyはコピー元とコピー先のフォルダ状態、使用するオプションによって挙動が変わります。 今回はそれぞれ以下の条件でコピーした場合にどのような動きをするのか見ていきたいと思います!

①コピー先に同じファイルがある場合
②コピー元のファイルを更新した場合
③コピー先のファイルを更新してしまった場合
④フォルダもコピーしたい場合
⑤robocopyのログを別ファイルに出力したい場合

①コピー先に同じファイルがある場合

先ほどの続きで、現在は同じファイルがコピー元、コピー先にある状態です。 この状態で再度同じコマンドを実行するとどうなるのか?
robocopy実行前
robocopy実行前



パッと見同じようにコピーが行われているかもしれませんが、結果の部分に注目してみると初回の時は「コピー済み」の項目でカウントされていたファイルが、 今回は「スキップ」項目のところでカウントされています。 これはrobocopyが同一のファイルとしてコピーをスキップ(=コピーしなかった)したということになります。

②コピー元のファイルを更新した場合

それではコピー元が更新されていたとしたらどうなるでしょうか?

編集前のファイル容量は0KBです。
②ファイル編集前
編集前のファイルサイズ


中身を適当に編集して保存します。
②ファイル編集
ファイル編集


容量が変わっていることが確認できます。もちろんコピー先にあるファイルは0KBのままです。
②実行前比較コピー元
コピー元ファイルサイズ




この状態で同じようにコマンドを実行します。
robocopy実行前
robocopy実行前



どうでしょう?また結果が変わりましたね!
今度はコピーしたファイルとして「テスト.txt」が表示されており、 「新しい」というステータスで「コピー済み」でカウントされていたりバイト数にも表記があることがわかりますね。 つまり、同じファイル名でも更新されていればコピー対象としてコピーしてくれるということですね。

もちろん、コピー先のファイルを見ても更新されていることが確認できます。
②実行後比較コピー先
コピー先ファイル確認

③コピー先のファイルを更新してしまった場合

それではコピー先を更新した場合はどうなるのか見てみましょう。

コピー先のテストファイルを更新して保存します。
※更新日時にも注目してみてね!
③コピー先ファイル編集
コピー先ファイル更新

この状態で同じようにコマンドを実行します。
robocopy実行前
robocopy実行前



「古い」というステータスになっており、「コピー済み」の項目でカウントされていることがわかります。

そして、ファイルの更新日時も更新前の時間に戻っていて、ファイルを開くと更新していたはずの文字が消えていることがわかります。
③コピー先ファイル確認
ファイル確認

つまり、コピー先が新しくてもコピー元と差異がある場合は、コピーしてしまうということですね。
なお、これはオプションを指定しない場合の動作となるので、「/XO」オプションを付けることでコピー元が古い場合は、スキップするということもできます。

④フォルダもコピーしたい場合

今まではファイルのみをコピーしてきましたが、フォルダをコピーしたい場合はどうでしょうか。
結論から言うとフォルダもコピーすることができます!
実際にフォルダがコピーできるところを見ていきましょう。

コピー元にテストフォルダを作成します。さらにそのフォルダ内にもテストファイルを作成しておきます。
④フォルダ作成
テストファイル作成


今まではファイル名を指定していましたが、代わりに「/E」オプションを付けてコマンドを実行します。
④robocopy実行前
robocopy実行前



コピー対象として「新しいディレクトリ」とその中に作成した「てすと.txt」が表示されており、「コピー済み」項目では新しく作成したフォルダとファイルがそれぞれカウントされ、「スキップ」項目では先ほどまでコピーされていた「テスト.txt」分がカウントされていることがわかります。

実際にコピー先を見てもしっかりコピーされていますね!
④コピー先確認
コピー先確認


⑤robocopyのログを別ファイルに出力したい場合

今までは、コマンドを実行したコマンドプロンプト上にそのまま実行結果が出力されていましたが、コマンドプロンプトを閉じてしまうと結果は消えてしまいます。
そこで、「/LOG:<ログファイル名>」のオプションを指定することで、別ファイルにログを残すことができます。

ログファイルの出力先用に「robocopylog」フォルダを作成します。中には何もファイルはありません。
⑤robocopylogフォルダ作成
フォルダ作成


先ほどのコマンドに「/LOG:」オプションを付けて実行してみます。
⑤robocopy実行前
robocopy実行前



すると、今まで表示されていたログが表示されずに、代わりにログファイル先が表示されていることがわかります。 ログの出力先として指定した「C:\robocopylog」に「robocopy_log.txt」ができていますので、ファイルの中身を見てみましょう。
⑤開く前
ログファイル出力確認



先ほどまでコマンドプロンプト上に表示されていた結果が、書き込まれていることがわかります。
このオプションを指定しておけば、ログをテキストで残すこともできるので後から見返すこともできます。
また、今回は少ない数のファイル、フォルダだったのでコマンドプロンプト上でも問題はありませんでしたが、 ファイル数が多いとその分だけログが出力されることになるので、コマンドプロンプトのバッファを超えるログになると最初のほうのログから消えていくことになりますのでご注意ください。
なお、「/LOG+:」という似たようなオプションもありますが、こちらは書き込む際に”追記”処理となります。 「/LOG:」は”上書き”処理となるので、状況に応じてオプションを使い分けてみてください!
※コマンドプロンプトのバッファは設定次第ですが、最大でも9999行です。

まとめ

いかがだったでしょうか?
今回は基本編なので細かいオプションは付けないで、基本的な使い方を中心に書かせていただきました。ここまで確認してきた内容をおさらいしてみましょう。

・robocopyはデータをコピーしてくれるツール
・ファイルもフォルダもコピーできる
・実行時の条件(状態)によって挙動が異なる
内容 結果
①コピー先に同じファイルがある場合 同じファイルはスキップされる
②コピー元のファイルを更新した場合 コピー元と同じ内容にコピー(更新)される
③コピー先のファイルを更新してしまった場合 コピー元と同じ内容にコピー(更新)される
※「/XO」オプションでコピー(更新)しなくなる
④フォルダもコピーしたい場合 「/E」オプションを付けることでコピーできる
⑤robocopyのログを別ファイルに出力したい場合 「/LOG:」または「/LOG+」オプションで出力できる



「ちょっと待って。すべてコピーしたい場合と定期的にバックアップしたい場合の例がないじゃん!」と 思われている方もいらっしゃるかと思いますが、どちらも説明が長くなってしまうので そちらは次回の「実践編」で記事にさせていただきます!
それでは最後まで読んでいただきありがとうございました!
次の「実践編」でお会いしましょう!

本記事はいかがでしたか?

横T
Follow 横T:

BS事業部 2018年1月 中途入社。現在はBSG事業部所属。 入社後は基盤チームとして1人前になれるよう日々精進中。 最近は生春巻きを巻くことにはまっている。