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

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

バッチファイルでファイルを比較後他のフォルダにコピ

次のようなファイル構成で C:\AAA     C:\BBB   \ccc      \ccc    abc.txt    abc.txt    def.jpg    def.jpg   \ddd      \ddd    ghi.txt    ghi.txt    jkl.jpg    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 を比較 全てのファイルに対し比較後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:\CCC(別のフォルダ)に階層を含めコピーする方法も含め ご教授をい願いします

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

  • ベストアンサー
  • notnot
  • ベストアンサー率47% (4847/10260)
回答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% (4847/10260)
回答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% (4847/10260)
回答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

  • dosでサイズを比較して異なるファイルだけコピー

    dosで全フォルダ内のファイルサイズを比較して異なるファイルだけコピーしたい 次のようなファイル構成で AAAフィルダ    BBBフォルダ  cccフォルダ    cccフォルダ   abc.txt      abc.txt   def.jpg      def.jpg  dddフォルダ    dddフォルダ   ghi.txt      ghi.txt   jkl.jpg      jkl.jpg AAA\ccc\abc.txtとBBB\ccc\abc.txt AAA\ccc\def.jpgとBBB\ccc\def.jpg AAA\ddd\ghi.txtとBBB\ddd\ghi.txt AAA\ddd\jkl.jpgとBBB\ddd\jkl.jpg 拡張子は問わずそれぞれに対するファイルのファイルサイズを比較して 大きくても小さくても異なるファイルだけbbbフォルダ内に上書きコピー したくご教授をお願いします

  • perlでのcsv形式のテキストファイルの変換

    perlを使用してcsv形式のテキストファイルを下記のように変換したいと思っています。 【変換前】 10, abc , def , ghi ,jkl    ----1行目 10, abc , def , aaa, bbb   ----2行目 10, abc , def , ccc , ddd  ----3行目 11, abc , def , eee , fff   ----4行目 11, abc , def , aaa , ggg ----5行目 11, zzz , def , aaa , ggg  ----6行目 12, abc , def , aaa ,ggg ----7行目 12, zzz , def, aaa , ggg   ----8行目 【変換後】 10, abc , def , ghi ,jkl    ----1行目 11, abc , def , eee , fff   ----4行目 11, zzz , def , aaa , ggg  ----6行目 12, abc , def , aaa ,ggg ----7行目 12, zzz , def, aaa , ggg   ----8行目 変換内容はcsv形式のテキストファイルで、”,”で区切った先頭3列が 前の行の先頭3列と同じならその行は出力しない、といった 変換をしたいと思っております。 (例えば2行目ですと先頭3列は10, abc ,defになっており、  1行目の先頭3列と同じ文字列になっているためこの行は出力しない) 当方、Perl初心者で上記のようなことがPerlでできるかも よくわかっておりません。 そこで、上記のような変換はPerlで可能なのか、そしてもし可能であるのなら どのようにPerlで記述すればできるのか教えていただけないでしょうか。 よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • ファイルのデーター削除

    下記のデーターが入っているabc.txtのファイルから 初めの2行を削除したいのですがよろしくお願いします。 10,aaa,100 11,bbb,200 12,ccc,200 13,ddd,300

    • 締切済み
    • PHP
  • 指定フォルダ配下のファイルを個別圧縮するバッチファイルの作成

    下記の処理を行うバッチファイルは作れないでしょうか? 1.バッチファイルにフォルダをドラッグ&ドロップ 2.ドラッグ&ドロップしたフォルダ配下のファイルを全て個別圧縮する (例.C:\AAAをドラッグ&ドロップした場合) フォルダAAA | ・111.txt | LフォルダBBB | ・222.txt | ・333.txt | LフォルダCCC | ・444.txt | LフォルダDDD ・555.txt ↓ フォルダAAA | ・111.zip | LフォルダBBB | ・222.zip | ・333.zip | LフォルダCCC | ・444.zip | LフォルダDDD ・555.zip

  • C言語 比較抽出

    C言語 コンソール VC6.0で悩んでいます。 ABC.com ABC.com DEF.co.jp GHI.go.jp DEF.co.jp DEF.co.jp JKL.com JKL.com ABC.com 上記のようなデータがsData[i]にあり、 ABC.com  3回 DEF.co.jp  3回 GHI.go.jp  1回 JKL.com  2回 のように画面に出力したいのですが、表示も処理も一緒だとややこしいので 表示は後回しにして、一度sHost[i]とiNum[i]に格納しようと考えています。 strcmpでの比較をwhileやforで多重ループで回すくらいしか思い付きません。 何か案だけでもいただけないでしょうか。お願いします。

  • モニターに IEを2枚開いたときに 

    モニターに IEを2枚開いたときに  それぞれに 違うサイトのオートコンプリートの補完機能を呼び出したい のですが・・・ たとえば  あるサイトで 補完機能を aaa bbb ccc ddd また 別のサイトでは abc def ghi jkl と 表示させることは 無理なのでしょうか? 最後に ひらいサイトで 機能が有効とされるのでしょうか? また なんらかの 方法で できる方法は ございますでしょうか?

  • バッチでのファイルのコピー

    ファイルのコピーをしたいのですが、 C:\aaa\bbb\???\test.txt と、「bbb」のディレクトリまでは分かるのですが、 必ず「???(任意)」のディレクトリが入ります。 そのディレクトリの下には必ず対象となるtest.txtと いうファイルが存在します。 「???」がなければ、 copy c:\ddd c:\aaa\bbb\test.txt と出来るのですが、「???」のために取ることが出来ません。 どなたか、ご存知の方がいましたら教えて下さい。 宜しくお願い致します。

  • PHPで、フォルダーにあるファイルを配列に取り込みたい

    例えば次の様なフォルダーとファイルがあるとき \abc\a.txt \abc\b.doc \abc\def\b.doc \abc\ghi\a.txt \abc\ghi\b.doc 次の様な結果を得たいのですが、どうすれば良いでしょうか? $dir[/abc/a.txt] = "/abc/a.txt" $dir[/abc/b.doc] = "/abc/b.doc" $dir[/abc/def/b.doc] = "/abc/def/b.doc" $dir[/abc/ghi/a.txt] = "/abc/ghi/a.txt" $dir[/abc/ghi/b.doc] = "/abc/ghi/b.doc" 再帰関数でできそうに思うのですが、いくら考えても分かりません。 $path = "\abc"; function getfiles($path) {} print_r(getfiles($path)); みたいにして取り出せると助かります。 すみませんが教えてください。

    • ベストアンサー
    • PHP
  • VB6.0 フォルダ配下(サブフォルダ含む)のファイルを全て読み込む方法

    環境 OS:WINDOWS 2000 PRO ソフト:VisualBasic 6.0 指定したフォルダ配下の全てのhtmlファイルを読み込む機能を作成したいと考えています。 C:\AAA\BBB\CCC\sample1.html C:\AAA\BBB\CCC\sample2.html C:\AAA\BBB\CCC\DDD\sample3.html C:\AAA\BBB\CCC\DDD\EEE\sample4.html C:\AAA\XXX\YYY\ZZZ\sample5.html 以上のような構造になっていた場合に、ルートフォルダとして『C:\AAA』を指定し、その配下全てのhtmlファイルを読み込み、1ファイルずつ加工したいと考えています。 何階層にも渡るファイルを全て読み込む方法がわかりません。 よろしくお願い致します。

  • Perlでの比較表現について

    度々失礼します。 Perlでの比較表現について、例えば $a=aaa,bbb,ccc,ddd; $b=aaa,bbb; if($a =~ $b){ print "include!"; } としたときの結果は include! となり、比較に合致するのですが、 $a=aaa,\[bbb\],ccc,ddd; $b=aaa,\[bbb\]; if($a =~ $b){ print "include!"; } という条件で実行すると、比較に合致せず何も表示されません。 こういった場合、どのように対処すればよろしいでしょうか。 ご存じの方がおられましたらご教授下さい。

    • ベストアンサー
    • Perl

専門家に質問してみよう