@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.
               (
geocities.com/mrnopersonality)