バッチファイルでファイルをコピーするには、copy・xcopy・robocopy の3つのコマンドを用途によって使い分けます。
この記事では 3コマンドの違いと選択基準 を軸に、基本構文からエラーハンドリング、実務で使える実践パターンまで体系的に解説します。
- copy コマンドの基本(1ファイル・ワイルドカード・ファイル結合)
- xcopy コマンド(フォルダごと・サブフォルダ再帰・属性保持)
- robocopy コマンド(ミラーリング・増分コピー・ログ出力)
- copy / xcopy / robocopy の使い分け早見表
- コピー失敗を確実に検知するエラーハンドリング
- 落とし穴5選(上書き確認・パス末尾・ファイル名スペース等)
- 実践例3本(日付バックアップ・増分コピー・ネットワーク共有コピー)
1. copy コマンド基本(単一ファイル・追加インストール不要)
Windows 標準の copy コマンドは、1ファイルまたはワイルドカードでのコピーに最適です。
1-1. 基本構文
:: 基本: ファイルを別の場所にコピー copy "コピー元" "コピー先" :: 具体例: C:\work\data.txt を D:\backup へコピー copy "C:\work\data.txt" "D:\backup\data.txt" :: コピー先のファイル名を変えてコピー copy "C:\work\report.xlsx" "D:\backup\report_copy.xlsx" :: コピー先フォルダのみ指定(ファイル名はそのまま) copy "C:\work\data.txt" "D:\backup\"
1-2. ワイルドカードで複数ファイルをコピー
@echo off :: *.txt: 同フォルダ内のすべてのテキストファイルをコピー copy "C:\work\*.txt" "D:\backup\" :: 特定のプレフィックスで始まるファイルをコピー copy "C:\work\report_*.xlsx" "D:\backup\" :: すべてのファイル(サブフォルダは除く) copy "C:\work\*.*" "D:\backup\"
1-3. ファイルを結合してコピー(テキスト結合)
@echo off :: + 演算子で複数ファイルを結合して1ファイルに出力 copy "C:\work\header.txt" + "C:\work\body.txt" + "C:\work\footer.txt" "C:\output\full.txt" :: /b: バイナリモード(テキスト変換しない) copy /b "C:\work\part1.bin" + "C:\work\part2.bin" "C:\output\merged.bin"
2. copy コマンドオプション完全解説
| オプション | 意味 | 用途 |
|---|---|---|
/Y |
上書き確認を表示しない | バッチ処理で確認ダイアログを抑制(必須) |
/-Y |
上書き前に確認する | 誤上書き防止(デフォルト動作を明示) |
/A |
ASCIIモード(テキスト) | テキストファイルのコピー・結合 |
/B |
バイナリモード | バイナリファイルの結合・コピー |
/D |
暗号化なしで保存 | 暗号化フォルダへのコピー時 |
/L |
シンボリックリンクのリンク先をコピー | シンボリックリンクの実体を取得 |
/N |
8.3形式の短いファイル名を使用 | 旧システム互換 |
/V |
コピー後に検証 | 重要ファイルのコピー確認 |
/Z |
再起動可能モード(ネットワーク) | ネットワークコピーの中断再開 |
copy コマンドはデフォルトで上書き確認ダイアログを表示します。バッチファイルで無人実行する場合は
/Y を必ず指定してください。
@echo off
:: /Y: 上書き確認なし(バッチ処理では必須)
copy /Y "C:\work\data.txt" "D:\backup\data.txt"
if %ERRORLEVEL% neq 0 (
echo [ERROR] コピー失敗
exit /b 1
)
echo [OK] コピー完了
3. xcopy コマンド(フォルダ構造ごとコピー)
xcopy は copy の拡張版で、フォルダ構造ごとのコピー・サブフォルダ再帰・属性保持に対応します。
3-1. フォルダごとコピー
@echo off :: /E: 空フォルダを含むすべてのサブフォルダをコピー :: /I: コピー先がフォルダであることを明示(ファイル/フォルダの確認を省略) :: /H: 隠しファイル・システムファイルもコピー :: /Y: 上書き確認なし xcopy "C:\work\project" "D:\backup\project" /E /I /H /Y :: /S: 空フォルダを除いたサブフォルダをコピー(/E より安全) xcopy "C:\work\project" "D:\backup\project" /S /I /Y
3-2. 特定の拡張子のみコピー
@echo off setlocal :: /S: サブフォルダ再帰 / フォルダ構造ごとコピー xcopy "C:\work\*.log" "D:\backup\logs" /S /Y :: ファイルリスト指定(/EXCLUDE: 除外リスト) :: exclude.txt に除外するパターンを1行ずつ記載 xcopy "C:\work" "D:\backup" /S /I /Y /EXCLUDE:exclude.txt endlocal
3-3. 更新されたファイルのみコピー(差分コピー)
@echo off :: /D: コピー先より新しいファイルのみコピー(差分コピー) xcopy "C:\work\project" "D:\backup\project" /S /I /Y /D :: /D:日付: 指定日以降に変更されたファイルをコピー xcopy "C:\work\project" "D:\backup\project" /S /I /Y /D:2025-01-01
4. xcopy オプション完全解説
| オプション | 意味 | 用途 |
|---|---|---|
/S |
空フォルダを除くサブフォルダをコピー | フォルダ構造ごとのコピー基本 |
/E |
空フォルダを含めすべてコピー | 完全バックアップ |
/I |
コピー先をフォルダとみなす | フォルダコピー時の確認を省略 |
/H |
隠しファイル・システムファイルをコピー | 全ファイル対象のバックアップ |
/Y |
上書き確認なし | バッチ処理(必須) |
/D |
新しいファイルのみコピー | 差分コピー・更新同期 |
/A |
アーカイブ属性のファイルのみコピー | バックアップ済みフラグ活用 |
/M |
アーカイブ属性ファイルのみコピーし属性をクリア | 増分バックアップ |
/K |
ファイル属性を保持 | 読み取り専用属性などを維持 |
/C |
エラーが発生しても処理続行 | 大量ファイルで一部エラー許容 |
/R |
読み取り専用ファイルも上書き | 読み取り専用ファイルのコピー |
/Q |
ファイル名を表示しない | サイレントコピー |
/EXCLUDE:ファイル |
除外パターンファイル指定 | 一時ファイル・キャッシュを除外 |
5. robocopy コマンド(最強・本番バックアップの第一選択)
robocopy(Robust File Copy)は Windows Vista 以降標準搭載の高機能コピーコマンドです。ミラーリング・増分コピー・ネットワーク越しの安定コピー・詳細ログに対応しており、本番バックアップの第一選択です。
5-1. 基本構文
:: robocopy 送信元フォルダ 送信先フォルダ [ファイルパターン] [オプション] :: フォルダをコピー(サブフォルダは除く) robocopy "C:\work\project" "D:\backup\project" :: サブフォルダ含めすべてコピー(空フォルダも) robocopy "C:\work\project" "D:\backup\project" /E :: 特定の拡張子のみコピー robocopy "C:\work\project" "D:\backup\project" *.log *.txt /E
5-2. ミラーリング(完全同期)
@echo off :: /MIR: ミラーリング(送信先に存在するが送信元にないファイルは削除) :: = /E + /PURGE の組み合わせ robocopy "C:\work\project" "D:\backup\project" /MIR :: /MIR はコピー先の余分なファイルが削除されるため注意! :: 初回は /E のみで動作確認してから /MIR に切り替えること
5-3. 増分コピー(変更ファイルのみ)
@echo off :: /XO: 送信先より新しいファイルをスキップ(変更されたファイルのみコピー) :: robocopy はデフォルトで日時・サイズが異なるファイルのみコピーする robocopy "C:\work\project" "D:\backup\project" /E /XO :: /MAXAGE:N: N日より古いファイルをスキップ(今日から数えてN日以内のみコピー) robocopy "C:\work\project" "D:\backup\project" /E /MAXAGE:30
5-4. ログ付きバックアップ
@echo off
setlocal enabledelayedexpansion
set "SRC=C:\work\project"
set "DST=D:\backup\project"
set "LOGDIR=C:\work\logs"
if not exist "%LOGDIR%" mkdir "%LOGDIR%"
:: 日付付きログファイル
for /f "tokens=2 delims==." %%D in ('wmic os get LocalDateTime /value ^| findstr LocalDateTime') do set "DT=%%D"
set "LOGFILE=%LOGDIR%\robocopy_%DT:~0,8%.log"
:: /E: 全サブフォルダ / /R:3: リトライ3回 / /W:10: 待機10秒
:: /LOG+: ログ追記 / /NP: 進捗非表示 / /TEE: 画面+ログ同時出力
robocopy "%SRC%" "%DST%" /E /R:3 /W:10 /LOG+:"%LOGFILE%" /TEE
:: robocopy の終了コード: 0-7 は成功/情報、8以上はエラー
set "RC=%ERRORLEVEL%"
if %RC% geq 8 (
echo [ERROR] robocopy 失敗 (exit code: %RC%)
exit /b %RC%
)
echo [OK] バックアップ完了
endlocal
6. robocopy オプション完全解説
| オプション | 意味 | 用途 |
|---|---|---|
/E |
空フォルダ含む全サブフォルダをコピー | 完全バックアップ |
/S |
空フォルダを除くサブフォルダをコピー | コンテンツのみコピー |
/MIR |
ミラーリング(余分なファイルを削除) | 完全同期・デプロイ |
/PURGE |
送信先の余分なファイルを削除 | 不要ファイル自動削除 |
/XO |
新しいファイルをスキップ | 増分コピー |
/XD フォルダ |
指定フォルダを除外 | .git・node_modules 等の除外 |
/XF ファイル |
指定ファイルを除外 | *.tmp・Thumbs.db 等の除外 |
/R:N |
失敗時のリトライ回数(デフォルト100万) | ネットワークコピーで必須 |
/W:N |
リトライ間隔(秒)(デフォルト30) | /R と組み合わせ |
/LOG:ファイル |
ログをファイルに出力(上書き) | 実行記録保存 |
/LOG+:ファイル |
ログをファイルに追記 | 継続的なバックアップ記録 |
/TEE |
画面とログファイルの両方に出力 | リアルタイム確認 + ログ保存 |
/NP |
進捗(%)を表示しない | ログファイルを見やすくする |
/COPYALL |
全属性・ACL・タイムスタンプを保持 | 完全バックアップ |
/MAXAGE:N |
N日以内のファイルのみコピー | 直近の変更のみ対象 |
/MT[:N] |
マルチスレッドコピー(デフォルト8) | 大量ファイルの高速化 |
0=変更なし 1=コピー成功 2=余分なファイルあり 4=ミスマッチ 8=エラー 16=致命的エラー
0〜7 は成功扱い、8以上がエラーです。通常の
if %ERRORLEVEL% neq 0 では誤判定になるため注意!
7. copy / xcopy / robocopy 使い分け表
| 用途 | 推奨コマンド | 理由 |
|---|---|---|
| 1ファイルのコピー | copy | シンプル・高速 |
| ワイルドカードで複数ファイルコピー | copy | パターン指定が簡単 |
| ファイルの結合 | copy | copy のみが対応 |
| フォルダ構造ごとコピー(1回限り) | xcopy /S /E /I /H /Y | オプション豊富・除外機能あり |
| 差分コピー(更新分のみ) | xcopy /D または robocopy | robocopy の方が確実 |
| 定期バックアップ・ミラーリング | robocopy /MIR | ログ・リトライ・属性保持が強力 |
| ネットワーク越しのコピー | robocopy /R:3 /W:10 | リトライ機能で安定 |
| 増分バックアップ(変更ファイルのみ) | robocopy + /XO または xcopy /M | アーカイブ属性活用 |
8. エラーハンドリング(コピー失敗の確実な検知)
コピーの成否を正しく判定してエラー時に処理を止めることが、信頼性の高いバッチの基本です。
@echo off
setlocal
set "SRC=C:\work\important.dat"
set "DST=D:\backup\important.dat"
:: コピー先フォルダが存在しない場合は作成
if not exist "D:\backup\" mkdir "D:\backup"
copy /Y "%SRC%" "%DST%"
set "COPY_ERR=%ERRORLEVEL%"
if %COPY_ERR% neq 0 (
echo [ERROR] コピー失敗 (exit code: %COPY_ERR%)
echo 送信元: %SRC%
echo 送信先: %DST%
exit /b %COPY_ERR%
)
echo [OK] コピー完了: %DST%
endlocal
robocopy のエラーハンドリング(終了コード 8以上のみエラー)
@echo off
robocopy "C:\work\project" "D:\backup\project" /E /R:3 /W:5
set "RC=%ERRORLEVEL%"
:: robocopy は 0-7 が成功(8以上がエラー)
if %RC% geq 8 (
echo [ERROR] robocopy 失敗 (exit code: %RC%)
exit /b %RC%
)
if %RC% equ 0 echo [INFO] 変更なし(コピー不要)
if %RC% equ 1 echo [OK] コピー成功
if %RC% equ 2 echo [INFO] 送信先に余分なファイルあり
exit /b 0
ERRORLEVEL の詳細は ERRORLEVELを使ったエラーハンドリング完全ガイド を参照してください。
9. 落とし穴5選と対策
落とし穴1:/Y なしだと確認ダイアログが出てバッチが止まる
:: NG: copy のデフォルトは上書き確認あり → バッチが止まる copy "C:\work\data.txt" "D:\backup\data.txt" :: → 「dest - data.txt を上書きしますか? (Yes/No/All):」 が表示されて停止 :: OK: /Y で上書き確認を抑制 copy /Y "C:\work\data.txt" "D:\backup\data.txt" :: xcopy も同様に /Y が必要 xcopy "C:\work" "D:\backup" /S /E /I /Y
落とし穴2:コピー先フォルダが存在しないと失敗する(copy/xcopy)
:: NG: D:\backup が存在しない場合、copy は失敗する copy "C:\work\data.txt" "D:\backup\data.txt" :: OK: コピー前にフォルダの存在を確認して作成 if not exist "D:\backup\" mkdir "D:\backup" copy /Y "C:\work\data.txt" "D:\backup\data.txt" :: xcopy は /I オプションがあればフォルダを自動作成する xcopy "C:\work\*.*" "D:\backup" /I /Y
落とし穴3:ファイル名やパスにスペースが含まれると失敗する
:: NG: スペースを含むパスは引用符なしだと失敗する copy C:\My Work\data file.txt D:\My Backup\data file.txt :: OK: パスを二重引用符で囲む copy /Y "C:\My Work\data file.txt" "D:\My Backup\data file.txt" :: xcopy でもパスはすべて引用符で囲む xcopy "C:\My Work" "D:\My Backup" /E /I /Y
落とし穴4:robocopy のデフォルトリトライ回数が100万回
:: NG: デフォルト /R:1000000 /W:30 → エラー時に長時間止まる robocopy "C:\work" "D:\backup" /E :: OK: /R と /W を必ず明示的に指定 robocopy "C:\work" "D:\backup" /E /R:3 /W:5 :: ネットワーク経由の場合は少し多めに設定 robocopy "\\server\share" "D:\backup" /E /R:5 /W:10
落とし穴5:robocopy の exit code を neq 0 で判定すると誤エラーになる
:: NG: robocopy は成功時も 1 や 2 を返す → neq 0 では誤エラーになる
robocopy "C:\work" "D:\backup" /E
if %ERRORLEVEL% neq 0 echo [ERROR] :: 成功時も誤ってエラーと判定される
:: OK: 8以上をエラーとして判定
robocopy "C:\work" "D:\backup" /E
set "RC=%ERRORLEVEL%"
if %RC% geq 8 (
echo [ERROR] robocopy 失敗
exit /b %RC%
)
echo [OK] 完了
条件分岐の詳細は バッチファイルで条件分岐する方法完全ガイド を参照してください。
10. 実践例3本
実践例1:日付フォルダ付きの自動バックアップ
毎日実行するバッチで、YYYYMMDD フォルダを作成してバックアップするパターンです。
@echo off
setlocal enabledelayedexpansion
set "SRC=C:\work\project"
set "BACKUP_ROOT=D:\backup"
:: 今日の日付を YYYYMMDD 形式で取得
for /f "tokens=2 delims==." %%D in ('wmic os get LocalDateTime /value ^| findstr LocalDateTime') do set "DT=%%D"
set "TODAY=%DT:~0,8%"
:: バックアップ先フォルダを作成
set "DST=%BACKUP_ROOT%\%TODAY%"
if not exist "%DST%" mkdir "%DST%"
:: robocopy でバックアップ(ログ付き)
set "LOGFILE=%BACKUP_ROOT%\backup_%TODAY%.log"
robocopy "%SRC%" "%DST%" /E /R:3 /W:5 /LOG:"%LOGFILE%" /NP
set "RC=%ERRORLEVEL%"
if %RC% geq 8 (
echo [ERROR] バックアップ失敗 (RC=%RC%)
exit /b %RC%
)
echo [OK] バックアップ完了: %DST%
echo ログ: %LOGFILE%
endlocal
日付取得の詳細は 日付と時間をファイル名に挿入する方法完全ガイド を参照してください。
実践例2:変更されたファイルのみを増分バックアップ(xcopy /M)
アーカイブ属性を利用した増分バックアップです。前回バックアップ以降に変更されたファイルのみコピーします。
@echo off
setlocal enabledelayedexpansion
set "SRC=C:\work\project"
set "DST=D:\incremental"
:: /M: アーカイブ属性のあるファイルのみコピーし、属性をクリア
:: → 次回実行時はそのファイルはスキップされる(変更されない限り)
xcopy "%SRC%" "%DST%" /M /S /E /I /Y
set "XC_ERR=%ERRORLEVEL%"
:: xcopy の終了コード: 0=成功 1=ファイルなし 2=Ctrl+C 4=初期化エラー 5=書き込みエラー
if %XC_ERR% gtr 1 (
echo [ERROR] 増分バックアップ失敗 (exit code: %XC_ERR%)
exit /b %XC_ERR%
)
if %XC_ERR% equ 1 echo [INFO] コピー対象ファイルなし(変更なし)
if %XC_ERR% equ 0 echo [OK] 増分バックアップ完了: %DST%
endlocal
実践例3:複数のコピー先へミラーリング(本番 + DR環境)
本番環境と災害対策(DR)環境の2箇所に同じフォルダをミラーリングするパターンです。
@echo off
setlocal enabledelayedexpansion
set "SRC=C:\work\data"
:: コピー先リスト(スペース区切りで複数指定)
set DEST_LIST="D:\backup\data" "\\backup-server\share\data"
set "ALL_OK=1"
for %%D in (%DEST_LIST%) do (
echo ミラーリング開始: %%D
robocopy "%SRC%" %%D /MIR /R:3 /W:5 /NP
set "RC=!ERRORLEVEL!"
if !RC! geq 8 (
echo [ERROR] 失敗 %%D (RC=!RC!)
set "ALL_OK=0"
) else (
echo [OK] 完了 %%D
)
)
if !ALL_OK! equ 0 (
echo [ERROR] 一部のミラーリングに失敗しました
exit /b 1
)
echo [OK] 全ミラーリング完了
endlocal
setlocal enabledelayedexpansion の詳細は setlocal enabledelayedexpansion 完全ガイド を参照してください。
フォルダのコピー方法は バッチファイルでフォルダをコピーする方法完全ガイド も参照してください。
ファイルの移動は バッチファイルでファイルを移動する方法完全ガイド、削除は バッチファイルでファイルを削除する方法完全ガイド を参照してください。
11. まとめ
| コマンド | 得意なこと | 苦手なこと | 主な注意点 |
|---|---|---|---|
| copy | 1ファイル・ワイルドカード・ファイル結合 | フォルダ構造・属性保持 | /Y 必須 |
| xcopy | フォルダ再帰・差分・除外リスト | ミラーリング・詳細ログ | /Y /I 必須・終了コードに注意 |
| robocopy | ミラーリング・増分・ログ・ネットワーク | 1ファイルのシンプルコピー | 終了コード 8以上のみエラー |
定期的なバックアップには バッチファイルで自動バックアップを作成する方法 も参照してください。
FAQ
copy /Y の /Y オプションが抜けています。バッチファイルでは copy /Y "コピー元" "コピー先" と必ず /Y を付けてください。xcopy でも同様に /Y が必要です。if %ERRORLEVEL% geq 8 で判定してください。/R:3 /W:10(リトライ3回・待機10秒)を指定してください。copy/xcopy にはリトライ機能がありません。また、/Z オプションで再起動可能モードを有効にするとネットワーク切断後に再開できます。xcopy "送信元" "送信先" /E /I /H /Y または robocopy "送信元" "送信先" /E を使います。/E は空フォルダも含めてすべてのサブフォルダをコピーします。/XD .git node_modules、xcopy では /EXCLUDE:除外リストファイル を使います。robocopy の方が指定が簡単です。例: robocopy "C:\project" "D:\backup" /E /XD .git node_modules /XF *.tmp Thumbs.db