【bat】バッチファイルでファイルをコピーする方法完全ガイド|copy・xcopy・robocopy・バックアップ・実践パターンまで

バッチファイルでファイルをコピーするには、copyxcopyrobocopy の3つのコマンドを用途によって使い分けます。

この記事では 3コマンドの違いと選択基準 を軸に、基本構文からエラーハンドリング、実務で使える実践パターンまで体系的に解説します。

この記事でわかること

  • copy コマンドの基本(1ファイル・ワイルドカード・ファイル結合)
  • xcopy コマンド(フォルダごと・サブフォルダ再帰・属性保持)
  • robocopy コマンド(ミラーリング・増分コピー・ログ出力)
  • copy / xcopy / robocopy の使い分け早見表
  • コピー失敗を確実に検知するエラーハンドリング
  • 落とし穴5選(上書き確認・パス末尾・ファイル名スペース等)
  • 実践例3本(日付バックアップ・増分コピー・ネットワーク共有コピー)
スポンサーリンク
  1. 1. copy コマンド基本(単一ファイル・追加インストール不要)
    1. 1-1. 基本構文
    2. 1-2. ワイルドカードで複数ファイルをコピー
    3. 1-3. ファイルを結合してコピー(テキスト結合)
  2. 2. copy コマンドオプション完全解説
  3. 3. xcopy コマンド(フォルダ構造ごとコピー)
    1. 3-1. フォルダごとコピー
    2. 3-2. 特定の拡張子のみコピー
    3. 3-3. 更新されたファイルのみコピー(差分コピー)
  4. 4. xcopy オプション完全解説
  5. 5. robocopy コマンド(最強・本番バックアップの第一選択)
    1. 5-1. 基本構文
    2. 5-2. ミラーリング(完全同期)
    3. 5-3. 増分コピー(変更ファイルのみ)
    4. 5-4. ログ付きバックアップ
  6. 6. robocopy オプション完全解説
  7. 7. copy / xcopy / robocopy 使い分け表
  8. 8. エラーハンドリング(コピー失敗の確実な検知)
    1. robocopy のエラーハンドリング(終了コード 8以上のみエラー)
  9. 9. 落とし穴5選と対策
    1. 落とし穴1:/Y なしだと確認ダイアログが出てバッチが止まる
    2. 落とし穴2:コピー先フォルダが存在しないと失敗する(copy/xcopy)
    3. 落とし穴3:ファイル名やパスにスペースが含まれると失敗する
    4. 落とし穴4:robocopy のデフォルトリトライ回数が100万回
    5. 落とし穴5:robocopy の exit code を neq 0 で判定すると誤エラーになる
  10. 10. 実践例3本
    1. 実践例1:日付フォルダ付きの自動バックアップ
    2. 実践例2:変更されたファイルのみを増分バックアップ(xcopy /M)
    3. 実践例3:複数のコピー先へミラーリング(本番 + DR環境)
  11. 11. まとめ
  12. FAQ

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 再起動可能モード(ネットワーク) ネットワークコピーの中断再開
重要: バッチファイルでは /Y を必ず付ける
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 コマンド(フォルダ構造ごとコピー)

xcopycopy の拡張版で、フォルダ構造ごとのコピー・サブフォルダ再帰・属性保持に対応します。

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) 大量ファイルの高速化
robocopy の終了コード(ERRORLEVEL)は特殊
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

Q. copy と xcopy と robocopy、どれを使えばいいですか?
A. 迷ったら robocopy を選ぶのがおすすめです。リトライ・ログ・増分コピーに対応しており、本番環境でも安全に使えます。1ファイルだけをシンプルにコピーする場合は copy、フォルダを一度だけコピーする場合は xcopy も適しています。
Q. copy コマンドで上書き確認ダイアログが出て止まります。
A. copy /Y/Y オプションが抜けています。バッチファイルでは copy /Y "コピー元" "コピー先" と必ず /Y を付けてください。xcopy でも同様に /Y が必要です。
Q. robocopy でコピーが成功しているのに ERRORLEVEL が 1 になります。
A. robocopy の終了コードは通常のコマンドと異なります。1 は「1ファイル以上コピー成功」を意味する正常な値です。8以上がエラーなので、if %ERRORLEVEL% geq 8 で判定してください。
Q. ネットワーク越しのコピーが途中で止まることがあります。
A. robocopy を使い、/R:3 /W:10(リトライ3回・待機10秒)を指定してください。copy/xcopy にはリトライ機能がありません。また、/Z オプションで再起動可能モードを有効にするとネットワーク切断後に再開できます。
Q. コピー先にサブフォルダも含めてすべてコピーしたい。
A. xcopy "送信元" "送信先" /E /I /H /Y または robocopy "送信元" "送信先" /E を使います。/E は空フォルダも含めてすべてのサブフォルダをコピーします。
Q. コピーしたくないフォルダ(.git、node_modules 等)を除外できますか?
A. robocopy では /XD .git node_modules、xcopy では /EXCLUDE:除外リストファイル を使います。robocopy の方が指定が簡単です。例: robocopy "C:\project" "D:\backup" /E /XD .git node_modules /XF *.tmp Thumbs.db