プロが教える店舗&オフィスのセキュリティ対策術

次のようなファイル構成で
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(別のフォルダ)に階層を含めコピーする方法も含め
ご教授をい願いします

A 回答 (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\ は空にしておいてください。

この回答への補足

回答ありがとうございます

テストで正常動作を確認しました、どうもありがとうございました
実践で躓いておりますが・・・

追加された/a-dの意味を教えていただけませんでしょうか
dir /?では調べきれませんでした

よろしくお願いいたします

補足日時:2012/11/24 13:37
    • good
    • 0

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%

この回答への補足

回答ありがとうございます

結果です
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のみです

補足日時:2012/11/24 05:24
    • good
    • 0

何をしたいのか不明です。



C:\AAA 以下のすべてのファイルについて、パス名の C:\AAA を C:\BBB に変えたファイルと比較するということでいいのか?

比較とはファイルの内容が一致するかどうかという比較なのか?そうでないならどういう意味か?

比較して一致したらどうするのか?一致しなかったらどうするのか?

この回答への補足

回答ありがとうございます

> 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(別のフォルダ)に階層を含め
コピーする方法もご教授をい願いします

補足日時:2012/11/23 15:01
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!