繁体   English   中英

BATCH递归比较两个文件夹

[英]BATCH Comparing two folders recursively

我正在更新一个大的保存脚本,我需要递归比较2个文件夹。 我想我已经很近了,但不明白缺少了什么...

代码如下:

set Rep1=f:\album1
set Rep2=f:\album2
set logfile=f:\logfile.txt
for /r "%Rep1%\" %%i in (*) do (
    fc "%%i" "%Rep2%\%%~nxi"
    iF ERRORLEVEL == 1 echo "%%i" et "%Rep2%\%%~nxi" Sont differents  >>  %logfile%
    iF ERRORLEVEL == 2 echo "%%i" et "%Rep2%\%%~nxi" Un des fichier est manquant >> %logfile%
)
pause

问题在于它将f:\\album1\\folder1\\file1.txt类的所有文件与f:\\album2\\file1.txt进行比较,因此比较总是错误的……您可以在图片中看到结果: http://i.stack.imgur.com/IQ9qt.png

如果任何人找到解决方案,非常感谢!

Vincs

@ECHO OFF
SETLOCAL
SET "sourcedir=U:\sourcedir"
SET "targetdir=U:\destdir"
FOR /f "delims=" %%a IN (
 'dir /s /b /a-d "%sourcedir%\*" '
 ) DO (
  SET "foundfile="
  FOR /f "delims=" %%c IN (
   'dir /s /b /a-d "%targetdir%\%%~nxa" 2^>nul'
  ) DO (
   SET foundfile=Y
   FC /b "%%a" "%%c" >NUL
   IF ERRORLEVEL 1 ECHO different "%%a" "%%c"
 )
 IF NOT DEFINED foundfile ECHO missing   "%%a" from "%targetdir%"
)
FOR /f "delims=" %%a IN (
 'dir /s /b /a-d "%targetdir%\*" '
 ) DO (
  SET "foundfile="
  FOR /f "delims=" %%c IN (
   'dir /s /b /a-d "%sourcedir%\%%~nxa" 2^>nul'
  ) DO (
   SET foundfile=Y
 )
 IF NOT DEFINED foundfile ECHO missing   "%%a" from "%sourcedir%"
)

GOTO :EOF

您将需要更改sourcedirtargetdir的设置以适合您的情况。

您的方法存在的一个问题是,文件%%i与“%Rep2%\\ %%〜nxi”进行了比较,这意味着仅在%rep2% ,而不在子目录中。

另一个问题是

IF ERRORLEVEL == 1 echo "%%i" et "%Rep2%\%%~nxi" Sont differents  >>  %logfile%

它将文字字符串ERRORLEVEL与文字字符串1进行比较,因此找不到匹配项。 要使用您的方法,您将必须使用setlocal enabledelayedexpansion语句来打开delayedexpansion setlocal enabledelayedexpansion ,然后使用IF !ERRORLEVEL!==1 ...

上面贴的解决方案比较有无论他们在树上发现了同样的名和扩展名的文件,所以如果file1.txt在第一树的任何地方 ,然后将它与所有file1.txt在第二的任何地方找到的文件树。

另请注意,在处理给文件提供长名和短名的标准系统时,存在标准异常。 每个文件可能有两个名字-和dir比赛在名称。

Magoo的答案已经指出了代码的主要问题。

但是,他提供的解决方案仅使用文件名来查找要比较的文件,因此,如果同名文件出现在源目录和目标目录的不同位置,或者如果多个同名文件出现在其中一个文件中,则该解决方案将失败。目录树。

这是基于dir /S命令的类似解决方案,该解决方案还要求树中的每个文件名都是唯一的,并且必须出现在源和目标内的同一位置(它不检查仅存在于其中一个文件中的文件)源或目标树):

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Provide source and target directory paths here:
set "SOURCE=.\source"
set "TARGET=.\target"

rem Convert relative paths to absolute ones:
for %%D in ("%SOURCE%") do set "SOURCE=%%~fD"
for %%D in ("%TARGET%") do set "TARGET=%%~fD"

for /F "eol=| delims=" %%I in ('
    2^> nul dir /B /S /A:-D "%SOURCE%\*.*"
') do (
    set "SRC=%%~fI"
    for /F "eol=| delims=" %%J in ('
        2^> nul dir /B /S /A:-D "%TARGET%\%%~nxI"
    ') do (
        set "TRG=%%~fJ"
        setlocal EnableDelayedExpansion
        > nul fc /B "!SRC!" "!TRG!" || echo "!SRC!" and "!TRG!" differ.
        endlocal
    )
)

endlocal
exit /B

此代码段仅比较源目录树和目标目录树中都存在的文件。 如果各个文件不同,则返回相关消息。


为了克服在不同位置使用相同文件名的问题,让我们使用xcopy /L命令,因为它能够返回相对于源目录的路径列表( /L选项可防止xcopy复制任何文件; find命令过滤掉? File(s)摘要行):

@echo off
setlocal EnableExtensions DisableDelayedExpansion

rem Provide source and target directory paths here:
set "SOURCE=.\source"
set "TARGET=.\target"

rem Convert relative paths to absolute ones:
for %%D in ("%SOURCE%") do set "SOURCE=%%~fD"
for %%D in ("%TARGET%") do set "TARGET=%%~fD"

pushd "%SOURCE%"
for /F "eol=| delims=" %%I in ('
    2^> nul xcopy /L /S /Y ".\*.*" "%TEMP%\" ^| find ".\"
') do (
    set "SRC=%%~fI"
    pushd "%TARGET%"
    for /F "eol=| delims=" %%J in ('
        2^> nul xcopy /L /Y "%%~I" "%TEMP%\" ^| find ".\"
    ') do (
        set "TRG=%%~fJ"
        setlocal EnableDelayedExpansion
        > nul fc /B "!SRC!" "!TRG!" || echo "!SRC!" and "!TRG!" differ.
        endlocal
    )
    popd
)
popd

endlocal
exit /B

此代码段还仅比较源目录树和目标目录树中都存在的文件。 如果您还想检查源树和目标树中是否都存在每个fil,请查看Magoo的答案 ,该答案为如何实现这一目标提供了一个好主意(两循环方法)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM