Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @ECHO OFF
- REM comparehashfiles v1.0 by HTWingNut 04 JUN 2023
- REM To be used with hash files format 'hash path/to/file'.
- REM Example:
- REM 64079BC17DF119E0119782B783534929 folders.txt
- REM *** USER INPUT REQUIRED:
- REM *** - create/edit file "excludecompare.ini" to add keyword tags
- REM *** for files to ignore if desired.
- REM *** One keyword per line, may include spaces.
- SET "batchpath=%~dp0"
- CD /D "%batchpath%"
- REM Cleaning up temp log files
- del ##_*.txt 2>NUL
- REM Generate Time Stamp
- SET "STAMPDATE=%DATE:/=%"
- SET "STAMPTIME=%TIME::=%"
- SET "TIMESTAMP=%STAMPDATE: =_%_%STAMPTIME:.=_%"
- SET "TIMESTAMP=%TIMESTAMP: =0%"
- SET "TIMESTAMP=%TIMESTAMP:~4,-3%"
- SET "TIMESTAMP=%TIMESTAMP:~4,4%%TIMESTAMP:~0,4%_%TIMESTAMP:~-6%"
- :start
- CLS
- IF NOT EXIST "excludecompare.ini" (
- echo *** Generating keyword exclusion file: "excludecompare.ini"
- echo(>"excludecompare.ini"
- )
- echo *** Add any keywords to exclude from comparison in "excludecompare.ini" file.
- echo *** One keyword per line, can include spaces.
- echo *** NO BLANK LINES WITH ONLY SPACES OR TABS.
- echo *** Current exclusions in "excludecompare.ini" file:
- echo ------------------------------------------------------------------------------
- (for /f "usebackq eol= " %%z in ("excludecompare.ini") do break) && type excludecompare.ini || echo NONE
- ECHO(
- ECHO(
- ECHO(
- ECHO *** Enter LOG FILE path information, relative or absolute.
- ECHO *** Log file format must be: [hash value] [relative\path\to\file]
- ECHO *** Current path: "%batchpath%"
- ECHO(
- :enterfile1
- SET /P "file1=Enter Log File 1: "
- IF NOT EXIST "%file1%" ECHO *** FILE DOES NOT EXIST & GOTO :enterfile1
- :lineskip1
- SET "skiplines1="
- SET "errorlevel="
- ECHO(
- ECHO First 10 Lines of Log File: '%file1%'
- findstr /n . "%file1%" | findstr "^[0-9]:"
- ECHO(
- ECHO Enter number of lines to skip at top of log file (ie header or non-hash info).
- CHOICE /C 0123456789 /N /M "Choose 0-9: "
- SET startline1=%errorlevel%
- SET /A skiplines1=%errorlevel% - 1
- ECHO(
- ECHO(
- :enterfile2
- SET /P "file2=Enter Log File 2: "
- IF NOT EXIST "%file2%" ECHO *** FILE DOES NOT EXIST & GOTO :enterfile2
- :lineskip2
- SET "skiplines2="
- SET "errorlevel="
- ECHO(
- ECHO First 10 Lines of Log File: '%file2%'
- findstr /n . "%file2%" | findstr "^[0-9]:"
- ECHO(
- ECHO Enter number of lines to skip at top of log file (ie header or non-hash info).
- CHOICE /C 0123456789 /N /M "Choose 0-9: "
- SET startline2=%errorlevel%
- SET /A skiplines2=%errorlevel% - 1
- ECHO(
- ECHO START: %DATE% %TIME% > "##_datetime.txt"
- ECHO( >>"##_datetime.txt"
- ECHO Comparing %file1% to %file2% >> "##_datetime.txt"
- ECHO( >>"##_datetime.txt"
- FOR %%I in ("%file1%") DO SET "fname1=%%~nI" & SET "fname1ext=%%~nxI"
- FOR %%I in ("%file2%") DO SET "fname2=%%~nI" & SET "fname2ext=%%~nxI"
- SET "fname1=%fname1: =_%"
- SET "fname2=%fname2: =_%"
- SET "exclude=1"
- ECHO(
- ECHO *** File '%file1%':
- ECHO *** Skipping these lines:
- findstr /n . "%file1%" | findstr "^[0-%skiplines1%]:"
- ECHO(
- ECHO *** Starting with line:
- findstr /n . "%file1%" | findstr "^[%startline1%]:"
- ECHO(
- ECHO(
- ECHO *** File '%file2%':
- ECHO *** Skipping these lines:
- findstr /n . "%file2%" | findstr "^[0-%skiplines2%]:"
- ECHO(
- ECHO *** Starting with line:
- findstr /n . "%file2%" | findstr "^[%startline2%]:"
- ECHO(
- SET "continue="
- SET /P "continue=OK? [ENTER] to continue or N to change: "
- IF defined continue CLS & GOTO :start
- FOR /f %%a in ('find "" /v /c ^< "excludecompare.ini"') do (set "linescomp=%%a")
- IF %linescomp% equ 0 SET "exclude="
- IF DEFINED exclude (
- findstr /I /G:"excludecompare.ini" /V "%file1%" > "##_FILE1_clean_p.txt"
- findstr /I /G:"excludecompare.ini" /V "%file2%" > "##_FILE2_clean_p.txt"
- )
- IF NOT DEFINED exclude (
- more "%file1%" > "##_FILE1_clean_p.txt"
- more "%file2%" > "##_FILE2_clean_p.txt"
- )
- @echo on
- more +%skiplines1% "##_FILE1_clean_p.txt" > "##_FILE1_clean.txt"
- more +%skiplines2% "##_FILE2_clean_p.txt" > "##_FILE2_clean.txt"
- @echo off
- CLS
- ECHO START: %DATE% %TIME%
- ECHO(
- FOR /F %%a in ('Find "" /v /c ^< "##_FILE1_clean.txt"') DO (SET "line1=%%a")
- ECHO Number of files to process in %fname1ext%: %line1%
- FOR /F %%a in ('Find "" /v /c ^< "##_FILE2_clean.txt"') DO (SET "line2=%%a")
- ECHO Number of files to process in %fname2ext%: %line2%
- ECHO %file1%: %line1% hashes >> "##_datetime.txt"
- ECHO %file2%: %line2% hashes >> "##_datetime.txt"
- ECHO( >> "##_datetime.txt"
- ECHO ---------------------------------------------------------------- >> "##_datetime.txt"
- ECHO( >> "##_datetime.txt"
- if %line1% GEQ %line2% (
- SET /A "fline=%line1%"
- SET "fname=%file1%"
- )
- if %line2% GEQ %line1% (
- SET /A "fline=%line2%"
- SET "fname=%file2%"
- )
- SET /A "fsizetime = fline / 1000"
- IF %fsizetime% EQU 0 SET "fsizetime = less than 1 minute"
- (FOR /F "usebackq tokens=1 delims= " %%a in ("##_FILE1_clean.txt") do ECHO %%a)>"##_hash1.txt"
- (FOR /F "usebackq tokens=1 delims= " %%a in ("##_FILE2_clean.txt") do ECHO %%a)>"##_hash2.txt"
- ECHO(
- ECHO ----------------------------------------------------------------
- ECHO(
- ECHO Extracting NON-MATCHING Hashes:
- findstr /G:"##_hash1.txt" /V /I /L "##_FILE2_clean.txt" > "##_HASH_IN_FILE2_NOT_IN_FILE1.txt"
- findstr /G:"##_hash2.txt" /V /I /L "##_FILE1_clean.txt" > "##_HASH_IN_FILE1_NOT_IN_FILE2.txt"
- ECHO(
- ECHO NON-MATCHING HASHES with same path and filename (i.e. modified or possibly corrupt): > "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
- SET "none="
- (FOR /F "usebackq tokens=1,* delims= " %%a in ("##_HASH_IN_FILE1_NOT_IN_FILE2.txt") DO (
- FOR /F "usebackq tokens=1,* delims= " %%q in ("##_HASH_IN_FILE2_NOT_IN_FILE1.txt") DO (
- IF ["%%b"] EQU ["%%r"] (
- ECHO %fname1ext%: %%a %%b
- ECHO %fname2ext%: %%q %%r
- SET none=1
- ECHO(
- )
- )
- )) >> "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
- IF NOT DEFINED none ECHO ALL CLEAR >>"##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
- ECHO(>> "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
- TYPE "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
- ECHO ----------------------------------------------------------------
- ECHO(
- ECHO ---------------------------------------------------------------- >> "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
- ECHO( >> "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
- SET "none="
- ECHO Extracting MATCHING Hashes with NON-MATCHING Path/Filename (i.e. duplicate, moved, or renamed file):
- ECHO Note: This may take a while... estimate 1 minute per 1000 lines in largest log file:
- ECHO %fname%: %fline% lines / %fsizetime% minutes
- ECHO(
- ECHO MATCHING HASHES with NON-MATCHING Path/Filename (i.e. duplicate, moved, or renamed file): > "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
- findstr /G:"##_hash1.txt" /I /L "##_FILE2_clean.txt" > "##_HASH_IN_FILE2_MATCHING_FILE1.txt"
- findstr /G:"##_hash2.txt" /I /L "##_FILE1_clean.txt" > "##_HASH_IN_FILE1_MATCHING_FILE2.txt"
- (FOR /F "usebackq tokens=1,* delims= " %%a in ("##_HASH_IN_FILE1_MATCHING_FILE2.txt") DO (
- FOR /F "usebackq tokens=1,* delims= " %%q in ("##_HASH_IN_FILE2_MATCHING_FILE1.txt") DO (
- IF ["%%a"] EQU ["%%q"] (
- IF ["%%b"] NEQ ["%%r"] (
- ECHO %fname1ext%: %%a %%b
- ECHO %fname2ext%: %%q %%r
- SET "none=1"
- ECHO(
- )
- )
- )
- )
- ) >> "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
- IF NOT DEFINED none ECHO ALL CLEAR >> "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
- ECHO(>> "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
- TYPE "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
- ECHO ----------------------------------------------------------------
- ECHO ---------------------------------------------------------------- >> "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
- ECHO( >> "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
- ECHO Extracting Unique File Names:
- ECHO(
- ECHO Unique Hash/File Names in "%fname1ext%": > "##_UNIQUE_FILES_FILE1.txt"
- SET "nomatch="
- SET "none="
- (FOR /F "usebackq tokens=1-3 delims=," %%a in ("##_HASH_IN_FILE1_NOT_IN_FILE2.txt") DO (
- FOR /F "usebackq tokens=1,* delims= " %%q in ("##_HASH_IN_FILE2_NOT_IN_FILE1.txt") DO (
- IF ["%%b"] EQU ["%%r"] SET nomatch=1
- )
- IF NOT DEFINED nomatch (
- ECHO %%a %%b
- SET "none=1"
- )
- SET "nomatch="
- )) >> "##_UNIQUE_FILES_FILE1.txt"
- IF NOT DEFINED none ECHO ALL CLEAR >> "##_UNIQUE_FILES_FILE1.txt"
- ECHO(>> "##_UNIQUE_FILES_FILE1.txt"
- TYPE "##_UNIQUE_FILES_FILE1.txt"
- ECHO ----------------------------------------------------------------
- ECHO ---------------------------------------------------------------- >> "##_UNIQUE_FILES_FILE1.txt"
- ECHO( >> "##_UNIQUE_FILES_FILE1.txt"
- ECHO Unique Hash/File Names in "%fname2ext%": > "##_UNIQUE_FILES_FILE2.txt"
- @ECHO OFF
- SET "nomatch="
- SET "none="
- (FOR /F "usebackq tokens=1,* delims= " %%a in ("##_HASH_IN_FILE2_NOT_IN_FILE1.txt") DO (
- FOR /F "usebackq tokens=1,* delims= " %%q in ("##_HASH_IN_FILE1_NOT_IN_FILE2.txt") DO (
- IF ["%%a"] EQU ["%%q"] SET nomatch=1
- )
- IF NOT DEFINED nomatch (
- ECHO %%a %%b
- SET "none=1"
- )
- SET "nomatch="
- )) >> "##_UNIQUE_FILES_FILE2.txt"
- IF NOT DEFINED none ECHO ALL CLEAR >> "##_UNIQUE_FILES_FILE2.txt"
- ECHO(>> "##_UNIQUE_FILES_FILE2.txt"
- TYPE "##_UNIQUE_FILES_FILE2.txt"
- ECHO ----------------------------------------------------------------
- COPY /A "##_datetime.txt" + "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt" + "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt" + "##_UNIQUE_FILES_FILE1.txt" + "##_UNIQUE_FILES_FILE2.txt" "#_HASHREPORT_%fname1%_vs_%fname2%.txt" >NUL
- ECHO ---------------------------------------------------------------- >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
- ECHO( >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
- ECHO OMITTED ENTRIES CONTAINING (from 'excludecompare.ini'): >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
- TYPE excludecompare.ini >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
- ECHO( >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
- ECHO( >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
- ECHO COMPLETE: %DATE% %TIME% >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
- ECHO(
- ECHO RESULTS SAVED IN "%batchpath%#_HASHREPORT_%fname1%_vs_%fname2%_%TIMESTAMP%.txt"
- REN "#_HASHREPORT_%fname1%_vs_%fname2%.txt" "#_HASHREPORT_%fname1%_vs_%fname2%_%TIMESTAMP%.txt"
- GOTO :END
- :END
- REM Clean up log files
- DEL /Q ##_*.txt 2>NUL
- ECHO(
- ECHO ** COMPLETE: %DATE% %TIME% **
- ECHO(
- PAUSE
- EXIT
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement