• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:バッチファイルでファイルを比較後他のフォルダにコピ)

バッチファイルでファイルを比較後他のフォルダにコピーする方法

このQ&Aのポイント
  • バッチファイルを使用してファイルを比較し、別のフォルダに階層を含めてコピーする方法について説明します。
  • 指定されたフォルダ内のファイルを比較し、サイズが異なる場合には別のフォルダにコピーします。
  • ただし、現在のコードではループが発生してしまうため、修正が必要です。

質問者が選んだベストアンサー

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.3

ああ、すいません。 >> echo F | xcopy %X% %Y% >echo F | xcopy %X% %Z% >としましたが タイプミスです。お気づきの通り、Zが正しい。 あと、 誤:for /f "delims=" %%F in ('dir /b /s') do call :SUB "%%~F" 正:for /f "delims=" %%F in ('dir /b /s /a-d') do call :SUB "%%~F" でした。 もとの物ではファイルだけでなくてフォルダも比較してしまっており、おかしくなってしまいました。 なお、実行前には C:\CCC\ は空にしておいてください。

think_2011
質問者

補足

回答ありがとうございます テストで正常動作を確認しました、どうもありがとうございました 実践で躓いておりますが・・・ 追加された/a-dの意味を教えていただけませんでしょうか dir /?では調べきれませんでした よろしくお願いいたします

その他の回答 (2)

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.2

No1です。 cd /d C:\AAA REM 以下のすべてのファイルについて、SUBを呼び出す for /f "delims=" %%F in ('dir /b /s') do call :SUB "%%~F" goto :EOF :SUB REM 文字列を置き換えて比較対象のファイル名、コピー先のファイル名を求める set X="%~1" set Y=%X:C:\AAA=C:\BBB% set Z=%X:C:\AAA=C:\CCC% REM 内容の比較 fc %X% %Y% >NUL 2>NUL REM 一致したら戻る if %ERRORLEVEL% == 0 goto :EOF REM 一致しなかったらコピー echo F | xcopy %X% %Y%

think_2011
質問者

補足

回答ありがとうございます 結果です C:\>d.bat C:\>cd /d C:\AAA C:\AAA>REM 以下のすべてのファイルについて、SUBを呼び出す C:\AAA>for /F "delims=" %F in ('dir /b /s') do call :SUB "%~F" C:\AAA>call :SUB "C:\AAA\ccc" C:\AAA>REM 文字列を置き換えて比較対象のファイル名、コピー先のファイル名を求める C:\AAA>set X="C:\AAA\ccc" C:\AAA>set Y="C:\BBB\ccc" C:\AAA>set Z="C:\CCC\ccc" C:\AAA>REM 内容の比較 C:\AAA>fc "C:\AAA\ccc" "C:\BBB\ccc" 1>NUL 2>NUL C:\AAA>REM 一致したら戻る C:\AAA>if 2 == 0 goto :EOF C:\AAA>REM 一致しなかったらコピー C:\AAA>echo F | xcopy "C:\AAA\ccc" "C:\BBB\ccc" C:\BBB\ccc\abc.txt を上書きしますか (Yes/No/All)? F C:\BBB\ccc\abc.txt を上書きしますか (Yes/No/All)? C:\BBB\ccc\abc.txt を上書きしますか (Yes/No/All)? C:\BBB\ccc\abc.txt を上書きしますか (Yes/No/All)? C:\BBB\ccc\abc.txt を上書きしますか (Yes/No/All)? C:\BBB\ccc\abc.txt を上書きしますか (Yes/No/All)? C:\AAA>call :SUB "C:\AAA\ddd" C:\AAA>REM 文字列を置き換えて比較対象のファイル名、コピー先のファイル名を求める C:\AAA>set X="C:\AAA\ddd" C:\AAA>set Y="C:\BBB\ddd" C:\AAA>set Z="C:\CCC\ddd" C:\AAA>REM 内容の比較 C:\AAA>fc "C:\AAA\ddd" "C:\BBB\ddd" 1>NUL 2>NUL C:\AAA>REM 一致したら戻る C:\AAA>if 2 == 0 goto :EOF C:\AAA>REM 一致しなかったらコピー C:\AAA>echo F | xcopy "C:\AAA\ddd" "C:\BBB\ddd" C:\BBB\ddd\ghi.txt を上書きしますか (Yes/No/All)? F C:\BBB\ddd\ghi.txt を上書きしますか (Yes/No/All)? C:\BBB\ddd\ghi.txt を上書きしますか (Yes/No/All)? C:\BBB\ddd\ghi.txt を上書きしますか (Yes/No/All)? C:\BBB\ddd\ghi.txt を上書きしますか (Yes/No/All)? C:\BBB\ddd\ghi.txt を上書きしますか (Yes/No/All)? C:\AAA>call :SUB "C:\AAA\ccc\abc.txt" C:\AAA>REM 文字列を置き換えて比較対象のファイル名、コピー先のファイル名を求める C:\AAA>set X="C:\AAA\ccc\abc.txt" C:\AAA>set Y="C:\BBB\ccc\abc.txt" C:\AAA>set Z="C:\CCC\ccc\abc.txt" C:\AAA>REM 内容の比較 C:\AAA>fc "C:\AAA\ccc\abc.txt" "C:\BBB\ccc\abc.txt" 1>NUL 2>NUL C:\AAA>REM 一致したら戻る C:\AAA>if 0 == 0 goto :EOF C:\AAA>call :SUB "C:\AAA\ccc\def.jpg" C:\AAA>REM 文字列を置き換えて比較対象のファイル名、コピー先のファイル名を求める C:\AAA>set X="C:\AAA\ccc\def.jpg" C:\AAA>set Y="C:\BBB\ccc\def.jpg" C:\AAA>set Z="C:\CCC\ccc\def.jpg" C:\AAA>REM 内容の比較 C:\AAA>fc "C:\AAA\ccc\def.jpg" "C:\BBB\ccc\def.jpg" 1>NUL 2>NUL C:\AAA>REM 一致したら戻る C:\AAA>if 1 == 0 goto :EOF C:\AAA>REM 一致しなかったらコピー C:\AAA>echo F | xcopy "C:\AAA\ccc\def.jpg" "C:\BBB\ccc\def.jpg" C:\BBB\ccc\def.jpg を上書きしますか (Yes/No/All)? F C:\BBB\ccc\def.jpg を上書きしますか (Yes/No/All)? C:\BBB\ccc\def.jpg を上書きしますか (Yes/No/All)? C:\BBB\ccc\def.jpg を上書きしますか (Yes/No/All)? C:\BBB\ccc\def.jpg を上書きしますか (Yes/No/All)? C:\BBB\ccc\def.jpg を上書きしますか (Yes/No/All)? C:\AAA>call :SUB "C:\AAA\ddd\ghi.txt" C:\AAA>REM 文字列を置き換えて比較対象のファイル名、コピー先のファイル名を求める C:\AAA>set X="C:\AAA\ddd\ghi.txt" C:\AAA>set Y="C:\BBB\ddd\ghi.txt" C:\AAA>set Z="C:\CCC\ddd\ghi.txt" C:\AAA>REM 内容の比較 C:\AAA>fc "C:\AAA\ddd\ghi.txt" "C:\BBB\ddd\ghi.txt" 1>NUL 2>NUL C:\AAA>REM 一致したら戻る C:\AAA>if 0 == 0 goto :EOF C:\AAA>call :SUB "C:\AAA\ddd\jkl.jpg" C:\AAA>REM 文字列を置き換えて比較対象のファイル名、コピー先のファイル名を求める C:\AAA>set X="C:\AAA\ddd\jkl.jpg" C:\AAA>set Y="C:\BBB\ddd\jkl.jpg" C:\AAA>set Z="C:\CCC\ddd\jkl.jpg" C:\AAA>REM 内容の比較 C:\AAA>fc "C:\AAA\ddd\jkl.jpg" "C:\BBB\ddd\jkl.jpg" 1>NUL 2>NUL C:\AAA>REM 一致したら戻る C:\AAA>if 0 == 0 goto :EOF C:\AAA>goto :EOF C:\AAA> となりました > echo F | xcopy %X% %Y% echo F | xcopy %X% %Z% としましたが C:\CCC\cccとC:\CCC\dddの拡張子のないファイルが出来ました 本来でしたら一致しないファイルはC:\AAA\ccc\def.jpgのみです

  • notnot
  • ベストアンサー率47% (4900/10358)
回答No.1

何をしたいのか不明です。 C:\AAA 以下のすべてのファイルについて、パス名の C:\AAA を C:\BBB に変えたファイルと比較するということでいいのか? 比較とはファイルの内容が一致するかどうかという比較なのか?そうでないならどういう意味か? 比較して一致したらどうするのか?一致しなかったらどうするのか?

think_2011
質問者

補足

回答ありがとうございます > C:\AAA 以下のすべてのファイルについて、パス名の C:\AAA を C:\BBB に変えた > ファイルと比較するということでいいのか? 意味が理解できませんでした > 比較とはファイルの内容が一致するかどうかという比較なのか? 比較とはファイルの内容が一致するかどうかという意味で使いました > 比較して一致したらどうするのか?一致しなかったらどうするのか? 比較し一致したら何もしない 一致しなかったファイルをC:\AAAからC:\CCC(別のフォルダ)に階層を含めコピー バッチファイルでファイルの内容が一致すれば何もしない 一致しないファイルを他のフォルダに階層を含めコピーしたい 次のようなファイル構成で C:\AAA\ccc\abc.txt  C:\BBB\ccc\abc.txt C:\AAA\ccc\def.jpg  C:\BBB\ccc\def.jpg C:\AAA\ddd\ghi.txt  C:\BBB\ddd\ghi.txt C:\AAA\ddd\jkl.jpg  C:\BBB\ddd\jkl.jpg C:AAA\ccc\abc.txt と C:BBB\ccc\abc.txt でファイルの内容が一致するかどうか比較 C:AAA\ccc\def.jpg と C:BBB\ccc\def.jpg でファイルの内容が一致するかどうか比較 C:AAA\ddd\ghi.txt と C:BBB\ddd\ghi.txt でファイルの内容が一致するかどうか比較 C:AAA\ddd\jkl.jpg と C:BBB\ddd\jkl.jpg でファイルの内容が一致するかどうか比較 上記の4ファイルに対して判定後一致しなければC:\AAA内のファイルを C:\CCC内に階層を含めコピーしたく for /R %%A in ("C:\AAA") do for /R %%B in ("C:\BBB") do if %%~zA NEQ %%~zB (goto A) :A echo NEQ としましたがループしてしまいました 実際には相対するファイルはたくさんあります 判定後一致しなかったファイルをC:\AAAからC:\CCC(別のフォルダ)に階層を含め コピーする方法もご教授をい願いします

関連するQ&A