Comparación recursiva del contenido del directorio mediante cmd de Windows XP con el archivo de salida.

Comparación recursiva del contenido del directorio mediante cmd de Windows XP con el archivo de salida.

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é fcaquí 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

información relacionada