[英]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
進行比較,因此比較總是錯誤的……您可以在圖片中看到結果:
如果任何人找到解決方案,非常感謝!
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
您將需要更改sourcedir
和targetdir
的設置以適合您的情況。
您的方法存在的一個問題是,文件%%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.