Deseo comparar archivos de dos directorios y subdirectorios de forma recursiva, sin instalación adicional en Windows XP. El árbol de carpetas y el nombre de los archivos es el mismo, pero el contenido de los archivos puede ser diferente. ¿Hay alguna forma de hacerlo? ¡Gracias!
Respuesta1
Algo como esto debería funcionar, asumiendo, como dijiste, que el árbol de origen y de destino son los mismos:
@ECHO OFF
set myrootfolder1=c:\stack\rootfolder1
set myrootfolder2=c:\stack\rootfolder2
set logfile=c:\stack\compare.log
type NUL > %logfile%
setlocal ENABLEDELAYEDEXPANSION
FOR /R %myrootfolder1% %%G IN (*.*) DO (
set sourcefile=%%G
set targetfile=!sourcefile:%myrootfolder1%=%myrootfolder2%!
echo N | comp /A !sourcefile! !targetfile! | find "OK" > nul
IF ERRORLEVEL 1 echo !sourcefile! and !targetfile! are different >>%logfile%
)
Esto generará un archivo de registro como este:
c:\stack\rootfolder1\file1.txt y c:\stack\rootfolder2\file1.txt son diferentes c:\stack\rootfolder1\sub1\file2.txt y c:\stack\rootfolder2\sub1\file2.txt son diferentes
Editar: no lo usé fc
aquí porque se han reportado errores para Windows XP cuando el comando compara archivos que difieren cada 128 bytes de una cadena de caracteres. Mi referencia:http://support.microsoft.com/kb/953929/en-us
Pero sigue los comentarios de @Synetech para obtener más información;) ¡gracias a él!
Respuesta2
Gracias a GD, lo encontré: Las carpetas comparativas: dir1 y dir2 están en la unidad D. El archivo logfile.txt para resultados comparables también está en la unidad D. en el archivo por lotes:
D:
setlocal enableextensions
setlocal ENABLEDELAYED EXPANSION
SETLOCAL ENABLEDELAYEDEXPANSION
set filename=logfile.txt
echo. 2>%filename%
cd dir1
(for /r %%i in (*) do set p=%%i&if exist "D:\dir2\!p:~8!" (FC "%%i" "D:\dir2\!p:~8!" | FIND "FC: no dif" > nul&IF ERRORLEVEL 1 (echo !!! file %%i is different >> d:\%filename%)) else (echo !!! file"D:\dir2\!p:~8!" not found >> d:\%filename%))>nul
cd ..\dir2
(for /r %%i in (*) do set p=%%i&if not exist "D:\dir1\!p:~8!" (echo !!! file "D:\dir1\!p:~8!" not found >> d:\%filename%))>nul
cd ..
start %filename%
Respuesta3
Escribí este lote en DOS puro. Puede comparar dos carpetas con subcarpetas y muestra mensajes visuales durante la comparación. Es útil para árboles pequeños de carpetas, por lo que puedes ver inmediatamente los errores en la pantalla de la consola mientras se realiza la comparación.
Nota: ¡La comparación se detendrá si ocurre un error de comparación! No produce un registro de errores, sin embargo, es posible redirigir el error Echo a un archivo de registro y cortar el comando Pausa.
Para árboles de carpetas o contenidos grandes es mejor utilizar herramientas específicas como ROBOCOPY o similares que producen Informes muy detallados, tanto para copiar como para comparar.
@Echo OFF
echo.
echo Compares Files in two or more Folders or Paths
echo ================================================
echo.
set /P Src= Digit or Paste HERE Path n.1 :
::set Src=YourPath
echo.
set /P Dst= Digit or Paste HERE Path n.2 :
::set Dst=YourPath
echo.
PAUSE
echo.
SETLOCAL EnableDelayedExpansion
FOR /R "%Src%" %%A IN (*.*) DO (
set SFold="%%A"
set TFold=!SFold:%Src%=%Dst%!
set P1="%%~dpA"
if "!P2!" EQU "" set P2=!P1!
if "!P1!" NEQ "!P2!" echo ----------------------------------------------------- Compare Folder is Changed & echo.
FC !SFold! !TFold!
if !ERRORLEVEL! NEQ 0 echo. - ERROR - ==================================================================== & PAUSE
set P2=!P1!
)
echo.
echo ====================================
echo COMPARE TERMINATED . . . .
echo ====================================
echo.
PAUSE