@ECHO OFF

IF "%~1"=="" GOTO :syntax
IF "%~1"=="/?" GOTO :syntax
IF "%~1"=="--help" GOTO :syntax
IF "%~1"=="--usage" GOTO :syntax
IF "%~1"=="-h" GOTO :syntax
IF "%~1"=="/h" GOTO :syntax
IF "%~1"=="/H" GOTO :syntax
IF "%~2"=="" GOTO :syntax
IF NOT "%~3"=="" IF /I NOT "%~3"=="--recurse" GOTO :syntax
GOTO :compare

:no_source
ECHO "%~1": no such folder
GOTO :EOF

:no_destination
ECHO "%~2": no such folder
GOTO :EOF

:syntax
ECHO Syntax:
ECHO   %0 foldername dupfolder
ECHO where.
ECHO     foldername  is the name of the source folder to compare
ECHO     dupfolder   is the name of the destination folder
GOTO :folder_done

:generate_compare_function
SETLOCAL
SET dircomp_supress_output=">>nul"
SET dircomp_error_output=">>"%TEMP%\dircomp_diff.txt""
SET dircomp_old_error_output=">>"%TEMP%\dircomp_old_items.txt""
SET dircomp_new_error_output=">>"%TEMP%\dircomp_new_items.txt""
SET dircomp_check_exists=
SET dircomp_search_path=

REM Check arguments
SET dircomp_search_path=%~f1
SET dircomp_check_exists=
FOR %%i IN (".") DO IF NOT "%%~$dircomp_search_path:i"=="" GOTO :check_dest
GOTO :no_source

:check_dest
SET dircomp_search_path=%~f2
SET dircomp_check_exists=
FOR %%i IN (".") DO IF NOT "%%~$dircomp_search_path:i"=="" GOTO :args_checked
GOTO :no_destination

:args_checked

REM Count lenght of arguments. This length will be substracted from absolute paths of all files compared
SET dircomp_src=%~1
SET dircomp_src_length=0

:source_char
SET dircomp_short_source=%dircomp_src:~1%
SET /A dircomp_src_length=dircomp_src_length+1
IF "%dircomp_short_source%"=="" GOTO :count_dest
SET dircomp_src=%dircomp_short_source%
GOTO :source_char

:count_dest
SET dircomp_dst=%~2
SET dircomp_dst_length=0

:dest_char
SET dircomp_short_dest=%dircomp_dst:~1%
SET /A dircomp_dst_length=dircomp_dst_length+1
IF "%dircomp_short_dest%"=="" GOTO :generate_batches
SET dircomp_dst=%dircomp_short_dest%
GOTO :dest_char


:generate_batches
SET /A dircomp_src_length=dircomp_src_length+1
SET /A dircomp_dst_length=dircomp_dst_length+1

REM Generate compare batch
FOR %%s IN (%dircomp_supress_output%) DO ECHO fc /B "%%~1" "%%~2" %%~s>"%TEMP%\dircomp_fc.bat"
ECHO SET modified=%%ERRORLEVEL%%>>"%TEMP%\dircomp_fc.bat"
ECHO IF ERRORLEVEL 1 SET dircomp_local_fname=%%~1>>"%TEMP%\dircomp_fc.bat"
ECHO IF ERRORLEVEL 1 SET dircomp_local_fname=%%dircomp_local_fname:~%dircomp_src_length%%%>>"%TEMP%\dircomp_fc.bat"
ECHO IF ERRORLEVEL 1 SET "src_file_new_mark= ">>"%TEMP%\dircomp_fc.bat"
ECHO IF ERRORLEVEL 1 SET "dst_file_new_mark= ">>"%TEMP%\dircomp_fc.bat"
ECHO IF ERRORLEVEL 1 FOR /F %%%%n IN ('xcopy /G /L /D /Q /R /Y "%%~1" "%%~2"') DO IF "%%%%n"=="1" (SET src_file_new_mark=*) ELSE (FOR /F %%%%m IN ('xcopy /G /L /D /Q /R /Y "%%~2" "%%~1"') DO IF "%%%%m"=="1" SET dst_file_new_mark=*)>>"%TEMP%\dircomp_fc.bat"
ECHO IF "%%modified%%"=="1" SET "timestamps=	    %%~t1 %%src_file_new_mark%%   %%~t2 %%dst_file_new_mark%%">>"%TEMP%\dircomp_fc.bat"
FOR %%s IN (%dircomp_error_output%) DO ECHO IF "%%modified%%"=="1" ECHO %%timestamps%%  %%dircomp_local_fname%% %%~s>>"%TEMP%\dircomp_fc.bat"
REM ECHO dircomp_fc.bat:
REM TYPE "%TEMP%\dircomp_fc.bat%
REM exit /b 1

REM Generate search batch
ECHO SET dircomp_search_path=%%~1>"%TEMP%\dircomp_folder_exists.bat"
ECHO IF "%%~$dircomp_search_path:2"=="" GOTO :not_found>>"%TEMP%\dircomp_folder_exists.bat"
ECHO SET dircomp_check_exists=exists>>"%TEMP%\dircomp_folder_exists.bat"
ECHO GOTO :EOF>>"%TEMP%\dircomp_folder_exists.bat"
ECHO. >>"%TEMP%\dircomp_folder_exists.bat"
ECHO :not_found>>"%TEMP%\dircomp_folder_exists.bat"
ECHO SET dircomp_check_exists=>>"%TEMP%\dircomp_folder_exists.bat"
REM TYPE "%TEMP%\dircomp_folder_exists.bat"
REM EXIT /B 1

REM Generate processor batch
ECHO CALL "%%TEMP%%\dircomp_folder_exists.bat" "%%~2" "%%~3" "%%~4">"%TEMP%\dircomp_process_entry.bat"
ECHO IF /I NOT "%%dircomp_check_exists%%"=="exists" GOTO :not_found>>"%TEMP%\dircomp_process_entry.bat"
ECHO. >>"%TEMP%\dircomp_process_entry.bat"
ECHO IF /I "%%~4"=="file" CALL "%%TEMP%%\dircomp_fc.bat" "%%~1\%%~3" "%%~2\%%~3">>"%TEMP%\dircomp_process_entry.bat"
ECHO IF /I "%%~4"=="dir"  CALL "%%~5" "%%~1\%%~3" "%%~2\%%~3" "%%~6">>"%TEMP%\dircomp_process_entry.bat"
ECHO GOTO :EOF>>"%TEMP%\dircomp_process_entry.bat"
ECHO. >>"%TEMP%\dircomp_process_entry.bat"
ECHO :not_found>>"%TEMP%\dircomp_process_entry.bat"
ECHO SET dircomp_local_fname=%%~1\>>"%TEMP%\dircomp_process_entry.bat"
ECHO SET dircomp_local_fname=%%dircomp_local_fname:~%dircomp_src_length%%%>>"%TEMP%\dircomp_process_entry.bat"
FOR %%i IN (%dircomp_old_error_output%) DO ECHO IF /I "%%~4"=="dir"  ECHO 	%%dircomp_local_fname%%%%~3\%%~i>>"%TEMP%\dircomp_process_entry.bat"
FOR %%i IN (%dircomp_old_error_output%) DO ECHO IF /I "%%~4"=="file" ECHO 	%%dircomp_local_fname%%%%~3%%~i>>"%TEMP%\dircomp_process_entry.bat"
REM ECHO dircomp_process_entry.bat
REM TYPE "%TEMP%\dircomp_process_entry.bat">dircomp_process_entry.bat
REM ECHO.

REM Generate reporting batch
ECHO CALL "%%TEMP%%\dircomp_folder_exists.bat" "%%~1" "%%~3" "%%~4">"%TEMP%\dircomp_report_entry.bat"
ECHO SET dircomp_local_fname=%%~2\>>"%TEMP%\dircomp_report_entry.bat"
ECHO SET dircomp_local_fname=%%dircomp_local_fname:~%dircomp_dst_length%%%>>"%TEMP%\dircomp_report_entry.bat"
FOR %%i IN (%dircomp_new_error_output%) DO ECHO IF /I NOT "%%dircomp_check_exists%%"=="exists" IF "%%~4"=="dir"  ECHO 	%%dircomp_local_fname%%%%~3\%%~i>>"%TEMP%\dircomp_report_entry.bat"
FOR %%i IN (%dircomp_new_error_output%) DO ECHO IF /I NOT "%%dircomp_check_exists%%"=="exists" IF "%%~4"=="file" ECHO 	%%dircomp_local_fname%%%%~3%%~i>>"%TEMP%\dircomp_report_entry.bat"
REM ECHO dircomp_report_entry.bat
REM TYPE "%TEMP%\dircomp_report_entry.bat">dircomp_report_entry.bat
REM ECHO.
GOTO :post_generate

:compare
IF NOT "%~3"=="--recurse" GOTO :generate_compare_function
:post_generate

for /D %%d in ("%~1\*") DO CALL "%TEMP%\dircomp_process_entry.bat" "%~1" "%~2" "%%~nd%%~xd" "dir"  "%~0" "--recurse"
for /D %%d in ("%~2\*") DO CALL "%TEMP%\dircomp_report_entry.bat"  "%~1" "%~2" "%%~nd%%~xd" "dir"  "%~0" "--recurse"
for %%f in ("%~1\*") DO    CALL "%TEMP%\dircomp_process_entry.bat" "%~1" "%~2" "%%~nf%%~xf" "file" "%~0"
for %%f in ("%~2\*") DO    CALL "%TEMP%\dircomp_report_entry.bat"  "%~1" "%~2" "%%~nf%%~xf" "file" "%~0"

:folder_done
IF /I "%~3"=="--recurse" GOTO :EOF

REM Display results and clean up files in %TEMP%
del "%TEMP%\dircomp_report_entry.bat"
del "%TEMP%\dircomp_process_entry.bat"
del "%TEMP%\dircomp_folder_exists.bat"
REM IF NOT EXIST %TEMP%\dircomp_diff.txt ECHO Done.
IF EXIST %TEMP%\dircomp_diff.txt ECHO Modified:
IF EXIST %TEMP%\dircomp_diff.txt TYPE "%TEMP%\dircomp_diff.txt"
IF EXIST %TEMP%\dircomp_diff.txt ECHO.
IF EXIST %TEMP%\dircomp_diff.txt DEL "%TEMP%\dircomp_diff.txt"
IF EXIST %TEMP%\dircomp_old_items.txt ECHO Only in %~1:
IF EXIST %TEMP%\dircomp_old_items.txt TYPE "%TEMP%\dircomp_old_items.txt"
IF EXIST %TEMP%\dircomp_old_items.txt ECHO.
IF EXIST %TEMP%\dircomp_old_items.txt DEL  "%TEMP%\dircomp_old_items.txt"
IF EXIST %TEMP%\dircomp_new_items.txt ECHO Only in %~2:
IF EXIST %TEMP%\dircomp_new_items.txt TYPE "%TEMP%\dircomp_new_items.txt"
IF EXIST %TEMP%\dircomp_new_items.txt ECHO.
IF EXIST %TEMP%\dircomp_new_items.txt DEL  "%TEMP%\dircomp_new_items.txt"

del "%TEMP%\dircomp_fc.bat"
SET dircomp_check_exists=
SET dircomp_error_output=
SET dircomp_supress_output=
ENDLOCAL
ECHO.

    Source: geocities.com/mrnopersonality/Text

               ( geocities.com/mrnopersonality)