コマンド別解説

xcopy(より高度なコピー)

>>xcopyのオプション簡易解説へ

こんなことを知りたい人へ向けて書いています

  • 「copy」コマンドでは実現できなかった、もう少し高度なコピーをしたい方
  • 「xcopy」コマンドでどんなことができるのか知りたい方
  • 「xcopy」コマンドで行えるはずの、目的の操作を探したい方

 

目次

その他の関連しそうな記事

 

「xcopy」コマンドの使い方

基本的には「copy」コマンドと同様の使い方ですが、オプションを付けることによってより高度なコピーを行うことができます。大きな特徴としては、フォルダごとコピーできるということです。これによって、バックアップ用のコマンドとしてよく使用されます。以下は基本的な「xcopy」コマンドの使い方です。

「xcopy」コマンドの[オプション]には非常に様々なものが用意されています。この記事でも使う頻度が高そうなオプションについては紹介していきますが、全ては扱いません。全ての使用できるオプションとその機能を確認したい方は、「xcopyのオプション簡易解説へ」を参照して下さい。

「copy」コマンドの高度化したコマンドとして、もう一つ「replace」コマンドがありますが、「xcopy」コマンドの方がより様々なオプションを使用でき、使い勝手もいいため、こちらが一般的によく使用されているようです。

 

日付が新しいファイルのみコピーする

バックアップコマンドとして「xcopy」コマンドを使うとき、必ず使用されるオプションとして、「/d」オプションがあります。これは、コピー先に同じ名前のファイルがあったときにコピー元のファイルと更新日時を比較して、新しければコピーするというオプションです。つまり、前回コピーしたファイルが変更されたときだけをコピーするというものです。

  • 前回から変更があるファイル → コピー対象
  • 前回から変更のないファイル → コピー対象外

更新日時が同じ場合には、そのファイルは前回から変更されていないということなので、コピーする意味がないと判断されコピーされません。これによってバックアップ時にすべてのファイルを毎回コピーしないでよくなるため、コピー時間が大幅に短縮されます。

 

以下の画像は、「file.txt」ファイルを「backup」という空フォルダに「/d」オプションを指定して二回続けてコピーしたときのコマンドプロンプト画面の表示です。

より高度なコピー 「/d」オプションを指定して新しい日時のファイルだけをコピー

一度目は通常通りコピーされていますが、二度目はコピーされていません。これは、「backup」フォルダには一度目にコピーしたファイルが既にあり、そのファイルも更新されていなかったので二度目のコピーではコピーする意味がないと判断されたためです。

 

指定の日付以降に変更されたファイルだけをコピーする

前節で登場した「/d」オプションに日付を追記して、指定の日付以降に変更されたファイルだけをコピーすることもできます。yyYY年MM月DD日以降に更新されたファイルをコピー対象としたい場合、

のように書きます。「/d:」の後に続けて日付を指定しますが、その順番に注意してください。「月」、「日」、「年の下2桁」の順です。

 

例として、以下の二つの更新日時が異なるファイルがあったとします。

  •   file_20161107.txt → 2016年11月7日に最終更新されたファイル
  •   file_20161121.txt → 2016年11月21日に最終更新されたファイル

2016年11月20日以降に更新されたファイルをコピー対象として「xcopy」コマンドを実行してみましょう。以下のようなコマンドになります。

「file_*.txt」はワイルドカード「*」を使って上記した二つのファイルを対象としていますが、11月20日以降に更新された「file_20161121.txt」だけがコピーされます。

 

サブフォルダごとコピーする

コピー対象としているフォルダの中にさらにフォルダがある(これを「サブフォルダ」と呼ぶ)とします。通常、「xcopy」コマンドではサブフォルダまではコピーされません。

【ファイル構成】
対象フォルダ ← ここを対象にコピー
  ∟サブフォルダ ← ここはコピーされない

フォルダ内のサブフォルダまで含めてコピーしたいときは、「/s」オプションを用います

 

例えば、「folder」フォルダの中にサブフォルダ「subfolder」が存在していて、「subfolder」フォルダごと「copy_folder」フォルダにコピーしたいときは、

とします。

——————————
またはディレクトリ名ですか
(F= ファイル、 D= ディレクトリ)?
——————————

と聞かれるので、「D」と入力するとフォルダ・サブフォルダ内のファイルも含めてコピーされます。

より高度なコピー 「/d」オプションを指定してサブフォルダまでコピー

 

ただし「/s」オプションでは、サブフォルダの中身が空の場合にはコピーされません。サブフォルダの中身が空でもフォルダをコピーしたい場合は、「/e」オプションを指定します。以下に「/s」オプションを使った場合と、次に「/e」オプションを使った場合のコマンドプロンプト実行画面を示します。

「xcopy」コマンドを使って、「folder」フォルダを「copy_folder」フォルダにコピーしようとしています。

一度目の「/s」オプションを使ったコマンドでは、「copy_folder」フォルダは作られていませんでした。次に「/e」オプションを使ったコマンドで、「copy_folder」フォルダが作られたのが分かります。

 

コピーしないファイルを指定する

「/exclude」オプションを使用して、コピーしたくないファイルをコピー対象から除外することができます。例として、「folder」フォルダの中に「file1.txt」、「file2.txt」、「file3.txt」があったとします。これらのファイルは「folder」フォルダへ入っています。

【ファイル構成】
folder(フォルダ)
 ∟file1.txt
 ∟file2.txt
 ∟file3.txt

この状況下で、

とすれば、もちろんフォルダ内の全てのファイルがコピーされます。

より高度なコピー オプションなしの実行

 

ここで、「file3.txt」をコピーしたくない場合を考えましょう。まず、コピーしたくないファイルを記述した除外リストファイルを作成します。ここでは、「exclude_filelist.txt」ファイルに以下のように書き込みました。

より高度なコピー コピーしたくないファイルのリストファイル

このファイルを「folder」フォルダが存在するフォルダに一緒に入れておきます。

 

次に「xcopy」コマンドを実行するのですが、そのとき「/exclude」オプションを使用し、続けて除外リストファイル(exclude_filelist.txt)を指定します。以下のような感じです。

「/exclude」オプションに「:」を挟んで除外リストファイルを指定しています。

以下、実行結果です。

より高度なコピー コピー除外リストを指定してコピー

「file3.txt」ファイルがコピーされていないことが分かります。この除外リストファイルにコピーしたくないファイルのリストを書いておけば、そのファイルのコピーを飛ばしてくれます。指定するファイルは複数でも構いません。

 

コピーしているファイル名を表示する・しない

ワイルドカード「*」で複数のファイルをコピー対象にしているときや、コピーに時間がかかるときには今何をコピーしているのか詳しく分かると便利です。オプションを付けない通常のコピーでも、コピー対象のファイル名は表示されます(下図)。

より高度なコピー オプションなしでコピーを実行

コマンド実行直後からコピーしているファイル名と、最後にいくつのファイルをコピーしたかという表示がでます。これがデフォルトの状態です。

 

「/f」オプションを付けると、どのコピー元フォルダからどのコピー先フォルダへコピーしたかが詳細に分かるようになります(下図)。

より高度なコピー コピー先を表示しながら実行

「コピー元ファイルのフルパス名 -> コピー先ファイルのフルパス名」と表示されています。ファイル名がフルパス付きで表示されるため、若干見づらくなる場合もあります。

 

逆に、コピーしているファイル名をまったく表示させたくないときは「/q」オプションを指定すると、まったくコピー情報の表示が最小限となります(下図)。

より高度なコピー コピー情報を表示せずにコピー

このように、コピーしたファイルの数だけが最後に表示されます。

 

指定したコピー先をフォルダとしてコピーする(自動で)

例えば、「folder」フォルダを「copyfolder」フォルダとしてオプション無しでコピーしようとした場合、「copyfolder」フォルダが存在しないときには、「copyfolder」がファイルなのかフォルダなのかを選択する必要があります(下図)。

より高度なコピー 通常のコピー

※バッチファイルでは「フォルダ」を「ディレクトリ」とも呼びます。

この場合、「copyfolder」はフォルダなので「D」を手動で入力すればよいのですが、少し面倒です。特にバッチファイルを使って完全に自動化処理をさせたい場合などは人間の操作が全く不要なプログラムを作りたいです。

そこで、「/i」オプションを使うと、この確認メッセージを省略することができます。勝手にディレクトリ(D)としてコピーを行ってくれるのです。

以下、「/i」オプションを付けた実行結果です。

より高度なコピー 「/i」オプションでディレクトリとしてコピー

確認メッセージは表示されずに、「D」を入力する手間が省けました。

 

コピーは行わずコピー対象となるファイル名を表示するだけ

「/l」オプションを指定すると、コピー対象となるファイルだけを表示して実際にコピーは行いません

例として、「folder」フォルダ、「folder\subfolder_1」フォルダ、「folder\subfolder_2」フォルダの下に「file1.txt」ファイル、「file2.txt」ファイル、「file3.txt」ファイルがそれぞれ入っている場合を考えます。以下のようなフォルダ構成です。

【フォルダ構成】
folder(フォルダ)
  ∟file1.txt
  ∟file2.txt
  ∟file3.txt
  ∟subfolder_1(サブフォルダ)
    ∟file1.txt
    ∟file2.txt
    ∟file3.txt
  ∟subfolder_2(サブフォルダ)
    ∟file1.txt
    ∟file2.txt
    ∟file3.txt

「/l」オプションを使用してどのファイルがコピー対象となるか以下のコマンドで確認を行います。

ここでは、前節で紹介した「/e」、「/i」オプションを指定しています。

  • /e → フォルダ内が空でもコピーする
  • /i → コピー先の指定をフォルダ(ディレクトリ)名とみなしてコピーする

でした。

実行結果は以下のようになります。

より高度なコピー 「/l」オプションでコピー対象ファイル名を表示し実際にコピーは行わない

この実行ではコピー対象ファイルの確認だけなので、「copyfolder」フォルダは作成されません。したがって、本当はコピー先フォルダを指定する必要もなく、以下のコマンドでも同様の結果が得ることができます。

より高度なコピー 「/l」オプションを指定しコピー先を指定せずに実行

 

確認メッセージを表示する・しない

コピー時にコピー先に指定したファイルが既に存在し、ファイルを上書きするときには、確認メッセージが表示されます。

ファイル毎に上書きするかどうかを尋ねられるので、上書きするときは「Y」、しないときは「N」を入力してコピーを進めます。また、「A」を入力すると、それ以降のファイルが全て上書きされます。以下は、その実行例です。「Y」や「N」、および「A」は自分の手で入力しています。

より高度なコピー コピー時の様々な確認メッセージ

このように一つ一つ確認しながらコピーを行う必要がなく、確認メッセージ表示させずに、全てを上書きしたい場合もあります。

確認メッセージを表示させたくない場合には、「/y」オプションを指定すれば全てを上書きする設定で実行されます。つまり、すべて「Y」、もしくは「A」を選択した結果と同様です。

より高度なコピー すべて上書きでコピーを実行

 

反対に、コピー先にファイルが無く、上書きでないコピーの場合でも、一つ一つのファイルを確認しながらコピーするかどうか決めたいときは、「/p」オプションを指定します。このようにすれば、毎回確認メッセージが表示されますので、「Y」および「N」を入力してコピーを進めることができます

より高度なコピー すべて確認しながらコピーを実行

 

ファイルはコピーせずにフォルダ構成だけを構築する

フォルダ内のファイルはコピーせずにフォルダ構成だけを構築したい場合は、「/t」オプションを用います

これで、「folder」フォルダ内のサブフォルダを含めてフォルダ構成だけが作成されますが、各フォルダにはファイルが存在しません。

例えば、以下のようなフォルダ構成があったとします。

【フォルダ構成】
folder(フォルダ)
  ∟file1.txt
  ∟file2.txt
  ∟file3.txt
  ∟subfolder_1(サブフォルダ)
    ∟file1.txt
    ∟file2.txt
    ∟file3.txt
  ∟subfolder_2(サブフォルダ)
    ∟file1.txt
    ∟file2.txt
    ∟file3.txt

このように、フォルダの中にはファイルが存在していますが、「folder」フォルダを「/t」オプションでコピーした場合、

作成された「copyfolder」フォルダは、以下のようになっています。

【フォルダ構成】
copyfolder(フォルダ)
  ∟subfolder_1(サブフォルダ)
  ∟subfolder_2(サブフォルダ)

ファイルは全て消え、フォルダ構成だけが残るのです。

コピー先に存在するファイルのみをコピーする

コピー先に存在するファイルのみをコピーするには、「/u」オプションを使用します

例えば、コピー元フォルダとして「folder」フォルダがあり、中には「file1.txt」ファイル、「file2.txt」ファイル、「file3.txt」ファイルがあったとします。そして、コピー先フォルダは既に「copyfolder」フォルダが存在し、中には「file1.txt」のみがある場合を考えます。以下のような状況です。

【コピー元】
folder
  ∟file1.txt
  ∟file2.txt
  ∟file3.txt

【コピー先】
copyfolder
  ∟file1.txt

このとき、「/u」オプションを使用した「xcopy」コマンドを実行すると、

「file1.txt」ファイルのみがコピー対象となります。※「/y」はコピー先に既存ファイルがある場合、上書きする前に確認メッセージを表示しないオプションです。以下に実行結果を示します。

より高度なコピー コピー先にあるファイルのみをコピーする

このように、コピー元とコピー先のフォルダに存在する共通のファイル「file1.txt」だけがコピーされました。

 

コピー開始前に一時停止し、キー入力でコピーを開始する

バッチファイルに「xcopy」コマンドを使用するときによく指定するオプションとして、「/w」があります。「/w」を指定すると、コピー開始前に一時停止しユーザーからのコピー開始許可を待ちます。以下の画像は実行例です。

より高度なコピー コピー前にユーザーの許可を待つ

何かのキーを押すとコピーが始まります。大規模なコピーを行う前の最終確認に利用できます。

Windowsバッチファイル初心者へ向けた入門書を作成しました


Windowsバッチファイル初心者の方へ向けた入門書(PDF)を作成しました。


・初めてWindowsバッチファイルを勉強してみようと思っている方

・使ったことはあるが一から基礎を学び直したい方


へ向けて丁寧な解説を行っています。


「全くプログラムを知らない方でも、この入門書を読んだ後には、Windowsバッチファイルの中級者レベルになれるように」をコンセプトに執筆したものです。


この本を読めば、バッチファイルを使ったファイルやフォルダの操作に関しては一通りのことができるようになります。そうなればもう十分中級者と呼べるレベルですので、あとは自分のやりたいことを実現しようとする中で徐々に知識を蓄えていくだけですぐに上級者へなれるでしょう。


詳しくみる

関連ページ

コメントを残す