Programming Field

Xcopy - DOS/コマンドプロンプト コマンド一覧

ファイル/ディレクトリをコピーします。ファイルの複数コピーやディレクトリの一括コピーに対応しています。

使い方

Xcopy使用例

XcopyはCopyコマンドと同様にファイルをコピーする機能を持ちますが、複数ファイルのコピーやディレクトリの一括コピーができるなど、Copyコマンドよりも高機能となっています。使い方としては、

xcopy /S /E C:\Foo N:\Bar\

のように、オプションを指定しつつ「コピー元」「コピー先」を指定することでコピーを行います(オプションは後ろに付けても問題ありません)。

Xcopyの特徴の1つに、Copyコマンドに比べてコピー操作を制御するオプションが豊富にあるという点があります。代表的なオプションに

  • /Y : 強制的に上書きを行う
  • /S : サブディレクトリもコピーする(空のディレクトリはコピーしない)
  • /E : 空のディレクトリも含めてサブディレクトリもコピーする(「/S /E」としても可)
  • /Q : コピー時の画面出力を省略する

といったものがあります。使い方の例は「例」もご覧ください。

構文

Xcopyヘルプ

xcopy[.exe] <source> [<destination>] [/A | /M] [/D[:<date>]] [/P]
  [/S] [/E] [/V] [/W] [/Y] [/-Y] [/C] [/I] [/Q] [/F] [/L] [/H] [/R]
  [/T] [/U] [/K] [/N] [/G] [/O] [/X] [/Z] [/B] [/J]
  [/EXCLUDE:<file1>[+<file2>]...]
  [/COMPRESS] [/SPARSE]

オプション一覧

<source>

コピー元のファイル/ディレクトリ名を指定します。ワイルドカードによる複数ファイル指定が可能です。また、「<drive>:」という指定はドライブ内にあるすべてのファイルをコピーすることを表します。なお、デバイスファイル名(CONNULなど)は指定できません。

コピー元がディレクトリである場合、以下のファイルに関するオプションはディレクトリ内の各ファイルに対して適用されます。

[MS-DOS] <source>を「\」で終わらせることはできません。ディレクトリの中身をすべてコピーしたい場合は、対象のディレクトリ名で終わらせるか、「\*.*」のようにワイルドカードを使います。

[Window 95以降] <source>を「\」で終わらせると、そのディレクトリの中に対する「*.*」と同じ動作をします。

<destination> コピー先のファイル/ディレクトリ名を指定します。なお、「<destination>」に指定された名前の末尾が「\」で終わっている場合はそのディレクトリの中にコピーされますが、「\」で終わっていない場合は「<destination>は受け側のファイル名ですか、ディレクトリ名ですか(F=ファイル、D=ディレクトリ)?」というプロンプトが表示されます(これは <destination> が「file.ext」のように拡張子を含んでいる場合も入ります)。
/A 「アーカイブ属性」の付いたファイルのみをコピーします。/Mと同時に指定することはできません。
/M 「アーカイブ属性」の付いたファイルのみをコピーし、コピー元ファイルのアーカイブ属性を解除します(コピー先ファイルのアーカイブ属性は残ります)。/Aと同時に指定することはできません。
/D[:<date>]

ファイルの日付(更新日時)が<date>以降のファイルのみをコピーします。「:<date>」を省略した場合はコピー元の日付がコピー先の日付より新しい場合にのみコピーが行われます。

[MS-DOS] <date>の省略はできません。また、<date>の書式はConfig.sys内のCOUNTRY指定に依存します。

[Windows NT系・Windows XP以降] <date>の書式は「月-日-年」で指定します。

/P 各ファイルのコピーを行う前に確認のプロンプトを表示します。
/S コピー元に含まれるディレクトリ・サブディレクトリもコピーします。/Eを指定しない場合は空のディレクトリをコピーしません。
/E コピー元に含まれるディレクトリ・サブディレクトリもコピーします。この際、コピーしようとするディレクトリが空であってもコピーします。「/S /E」は「/E」と同じ指定とみなされます。
/V [MS-DOS, Windows NT系・Windows XP以降] ファイルをコピーする度にコピー元ファイルとコピー先ファイルが同一かどうかの検証を行います。([Windows NT系・Windows XP以降] ファイルサイズが一致するかどうかのみを検証します。)
/W コピーを開始する前に任意のキー入力を求めるプロンプトを表示します。このプロンプトを表示させることで、Ctrl+Cによるキャンセルを行えるようにします。
/Y コピー先のファイルが存在する場合に上書きするかどうかの確認のメッセージを表示させず、強制的に上書きするようにします。
/-Y コピー先のファイルが存在する場合に上書きするかどうかの確認のメッセージを表示させます。(環境変数 COPYCMD で「/Y」が設定されていても表示します。)
/C [Windows 95以降] コピー時にエラーが発生しても残りのファイルコピーを続けます。
/I [Windows 95以降] <destination>に指定されたファイル/ディレクトリが存在しない場合、その名前をディレクトリ名として扱い、そのディレクトリ内にコピーします。
/Q [Windows 95以降] コピー中にファイル名を表示しません(Quietモード)。
/F [Windows 95以降] コピー中にコピー元とコピー先のファイル名をすべて表示します。
/L [Windows 95以降] コピーしようとするファイル名をすべて表示します。ファイルのコピーは行いません。
/H [Windows 95以降] コピー元に隠しファイル・システムファイルが含まれている場合、それらもコピーします。
/R [Windows 95以降] コピー先に読み取り専用ファイルが存在しても、それを上書きします。
/T [Windows 95以降] ディレクトリだけを作成し、ファイルはコピーしません(コピー元と同じディレクトリツリーを作成します)。「/E」を指定しない場合はコピー元に存在する空のディレクトリは作成されず、「/E」を指定した場合は空のディレクトリも作成されます。
/U [Windows 95以降] コピー先のファイルを更新します。このオプションを指定すると、コピー元とコピー先に同じファイルがある場合、コピー元が古い場合はコピーされません。
/K [Windows 95以降] コピー元の属性もコピーします。/K を指定しなかった場合は「読み取り専用」属性が解除されます。
/N [Windows 95以降] MS-DOS 形式以外のファイル名(長いファイル名など)を持つファイルをコピーするとき、できる限り短いファイル名でコピーします。
/G [Windows NT系・XP以降] コピー先が暗号化をサポートしていない場合でも、コピー元に含まれる暗号化されたファイルをコピーします。
/O [Windows NT系・XP以降] ファイルの所有権およびACL情報(アクセス権など)もコピーします。
/X [Windows NT系・XP以降] ファイルの監査設定もコピーします。/X が指定された場合は /O の意味も含みます。
/Z [Windows NT系・XP以降] ネットワークファイルを再起動可能モード(restartable mode)でコピーします。通信不良などが発生してコピーに失敗した場合、同じファイル名を用いればコピーを再開することができます。
/B [Windows NT系・XP以降] コピー元にシンボリックリンクがある場合、シンボリックリンクのリンク先でなく、シンボリックリンクそのものをコピーします。
/J [Windows NT系・XP以降] コピー時にバッファされていないI/Oを使ってコピーを行います。サイズが大きいファイルをコピーする際に適しています。
/EXCLUDE:<file1>[+<file2>]...

[Windows NT系・XP以降] 複数のファイルをコピーする際にコピーから除外したいファイルのパターンを記述したテキストファイルを指定します。このテキストファイルには、1行に1パターンの書式で、複数のパターンを記述することができます。パターンファイルは、「+」でつなげて複数指定することができます。

テキストファイルに記述するパターンは、そのパターン文字が絶対パスの一部分と一致したら除外されます。例えば、「\temp\」と記述すると、コピーするファイルが(任意の位置の)「temp」ディレクトリ内に含まれていたらコピーされなくなります。「.obj」と記述した場合は、拡張子が「.obj」のファイルや「.obj」が名前に含まれるファイルなどが除外されます。

/COMPRESS

[Windows 10 2004 および 17763.1432?以降] 利用可能な場合、「SMB圧縮」(SMB Compression)を利用してコピー処理を行います。「SMB圧縮」はネットワーク越しのコピー操作においてデータ圧縮を行い、帯域を節約する(転送速度向上などを行う)ことを可能にします。

※ この機能を利用するには、コピー先がSMB圧縮に対応している必要があります。

/SPARSE [Windows 11 22H2?以降] スパースファイルをコピーする際、スパース状態をそのままコピーします。このオプションを指定しない場合、スパースファイルをコピーするとコピー先ファイルは非スパースファイルになります。

解説

ファイルやディレクトリをコピーするプログラムで、Copyコマンドよりも詳細な指定を行うことができます。またCopyと異なり、ファイルをディレクトリごとコピーすることもできます。

[MS-DOS] Xcopyでは0バイトのファイルもコピーすることができます(Copyではコピーできません)。

[Windows XP?以降] ファイル属性やタイムスタンプによるファイル選択やコピー元とコピー先のミラーリングなどを行う場合は、Robocopyの使用も検討してください。

ファイル名かディレクトリ名かを問う出力

コピー先に指定した名前が「\」で終わっていない場合に、そのコピー先が存在しないとXcopyは「<名前> は受け側のファイル名ですか、ディレクトリ名ですか(F=ファイル、D=ディレクトリ)?」というプロンプトを表示し操作を求めます。これを避けたい場合は以下の対策を行う必要があります。

  • コピー先の名前がディレクトリを意図しているのであれば、「\」を末尾に付加します。
  • [Windows 95 以降] あるいは、「/I」オプションを付けることでコピー先を常にディレクトリとして扱うことができます。
  • コピー先がディレクトリではなくファイルである場合は、後述のアーカイブファイルコピーの例のように、パイプ「|」を使って選択肢を事前にセットすることができます。
    • ただし、単体のファイルをコピーする場合は多くのケースでCopyコマンドの方が向いています。

アーカイブ属性のついたファイルのコピー

「アーカイブ属性」とはファイルに付く属性の1つで、「バックアップ対象である」などの意味を持つ属性です。通常、ファイルの作成や編集などを行って保存するとアーカイブ属性は自動的に付与され、何らかのバックアップ操作などを行った際にその操作の一環でアーカイブ属性の解除が行われます。

Xcopyではこのアーカイブ属性を考慮したコピー操作を行うことが可能であり、/A オプションや /M オプションの利用がこれに該当します。/A オプションおよび /M オプションはアーカイブ属性のついたファイルのみコピー先にコピーするという効果を持つため、実質的に「更新されたファイルのみをコピーする」といった操作を行うことができます。なお、/A オプションと /M オプションはともに「アーカイブ属性の付いたファイルのみ」をコピーする効果を持ちますが、/M オプションはコピーのアーカイブ属性を解除するという効果があり、これによって「バックアップ済みである」といったことをマークすることができます。

ファイルの更新

[Windows 95 以降] 「/U」オプションを付加すると、Xcopyを使って「ファイルの更新コピー」を行うことができます。具体的には、「コピー先に同じファイルがない、またはコピー先ファイルがコピー元より(更新日時が)古い場合にファイルのコピーが行われる」という動作になります。主にバックアップやファイル転送の操作において、コピー先が何らかの理由で更新されている状態になったものを誤って上書きするのを防ぐ目的で使うことができます。

※ なお、Robocopyで同様の操作を行う場合は「/XO」を使います。

終了コード

Xcopyは、正常終了すると終了コード(Errorlevel)を0に、それ以外の場合は1以上を設定します。そのため、Ifを使ってエラーチェックを行うことができます。(具体的なエラーコードは不明)

サンプル1

xcopy /Y C:\Documents\hoge.txt D:\Backup\

ファイル「C:\Documents\hoge.txt」を、ディレクトリ「D:\Backup」の中にコピーします。「/Y」オプションにより、既にファイルが存在する場合は無条件で(強制的に)上書きを行います。

サンプル2

xcopy /Y /Q /S /E E:\My\Directory\*.* F:\Foo\Bar\Directory\

ディレクトリ「E:\My\Directory」とその中身(ファイルおよびサブディレクトリ)を、ディレクトリ「F:\Foo\Bar\Directory」内にまるごとコピーします。「/S /E」があるため、ディレクトリ構造も含めてコピーされます。(/Y オプションがあるので中に含まれるファイルが一部存在する場合は無条件で上書きを行います。) また、「/Q」オプションによりコピー時にファイル名を画面に出力しません。

※ なお、「F:\Foo\Bar\Directory」が存在しない場合は自動的に作成されます。

サンプル3

xcopy /A /S /E /Y C:\MyDoc\*.* D:\Backup\MyDoc\

「C:\MyDoc」内にあるすべてのファイルのうち「アーカイブ属性」がついたファイルを、「D:\Backup\MyDoc」ディレクトリ内にコピーします。この際、「C:\MyDoc」内のサブディレクトリ内にあるファイルも(同じディレクトリ構造で)コピーします。

Attribコマンドの例もご覧ください。

サンプル4

xcopy /Y /Q /S /E /M E:\My\Directory\*.* F:\Foo\Bar\

ディレクトリ「E:\My\Directory」の中身のうち「アーカイブ属性」の付いたファイルおよびサブディレクトリを、ディレクトリ「F:\Foo\Bar」内にまるごとコピーします(中に含まれるファイルが一部存在する場合は無条件で上書きを行います)。「/M」オプションがあるため、コピー元ファイルについていたアーカイブ属性は解除されます。

サンプル5

echo F| xcopy /M file1.txt file2.txt

file1.txt に「アーカイブ属性」が付いている場合、file1.txt をコピーして file2.txt を作成します。「file2.txt」は末尾が「\」で終わっていないため、「file2.txt は受け側のファイル名ですか、ディレクトリ名ですか(F=ファイル、D=ディレクトリ)?」などの入力待ちが表示されますが、自動的に「F」を入力させるためにEchoコマンドを使用しています。

なお、コマンド実行後は file1.txt のアーカイブ属性は解除されます(file2.txt のアーカイブ属性は残ります)。

※ 単体のファイルをコピーする場合は通常Copyコマンドを使用します。
※ 「echo F」ではなく「echo D」とすると、「file2.txt」というディレクトリが作成され、その中に file1.txt がコピーされます。
※ file2.txtが存在する場合、「file2.txt は受け側のファイル名ですか、ディレクトリ名ですか(F=ファイル、D=ディレクトリ)?」ではなく「file2.txt を上書きしますか (Yes/No/All)?」といった入力待ちが表示される(のに対し与える入力が「F」のみとなる)ため、上記のコマンドは失敗します。強制的に上書きを行う場合は /Y スイッチを指定します。

サンプル6

xcopy /U /S /E /Y Z:\Data\*.* E:\Current\Data\

[Windows 95以降] 「Z:\Data」内のすべてのファイルを「E:\Current\Data」内にコピーしますが、コピーしようとするファイルがコピー先に存在し、コピー先のファイルが新しい場合はコピーしません。ファイルを更新するときなどに使います。

サンプル7 (バッチファイル)

@echo off
setlocal enableextension
for /F "tokens=1,2,* delims=:" %%i in ("%TIME%") do set MYTIME=%%i%%j
set DIR_NAME=E:\Backup\src_%DATE:/=%_%MYTIME%
if not exist "%DIR_NAME%" md "%DIR_NAME%"
xcopy /S /E /Y /Q /EXCLUDE:"E:\Backup\excludes.txt" D:\Develop\src\*.* "%DIR_NAME%\"

[Windows NT系] [拡張構文] 「E:\Backup」内に日付と時刻が名前に入ったディレクトリを作成し、その中に、「D:\Develop\src」内にあるファイルのうち「E:\Backup\excludes.txt」に記述されたパターンに一致するファイルを除くすべてのファイルをコピーします。このような記述のバッチファイルを作ることで、その時点におけるバックアップを簡単に作成することができます。

なお、ファイル名に文字「/」や「:」は使用できないため、ForSetを用いて日付や時刻からそれらの文字を取り除いています。

関連項目