Advertisement
HTWingNut

Hashdeep File Compare

May 1st, 2023 (edited)
126
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.51 KB | Software | 0 0
  1. @ECHO OFF
  2. REM v2.01a 27_May_2022
  3. REM CHANGELOG: revised "nonone" (error) variable to "none"
  4. REM added end time to log
  5. REM added log file sizes to estimate time
  6. REM To be used with HASHDEEP files
  7.  
  8. SET "batchpath=%~dp0"
  9. CD /D "%batchpath%"
  10. ECHO %batchpath%
  11.  
  12. REM >>> CHANGE PARAMETERS FOR COMPARING TWO HASHLOGS FROM HASHDEEP <<<
  13. REM *** ENTER TWO HASHLOGS TO COMPARE ***
  14. SET "file1=file1.log"
  15. SET "file2=file2.log"
  16. REM >>> END USER INPUT <<<
  17.  
  18. IF NOT EXIST "excludecompare.txt" (
  19. echo ##
  20. echo %%%%%%%%
  21. echo @ea
  22. )>"excludecompare.txt"
  23.  
  24. ECHO Cleaning up temp log files
  25. del ##_*.txt 2>NUL
  26.  
  27. REM Generate Time Stamp
  28. SET "STAMPDATE=%DATE:/=%"
  29. SET "STAMPTIME=%TIME::=%"
  30. SET "TIMESTAMP=%STAMPDATE: =_%_%STAMPTIME:.=_%"
  31. SET "TIMESTAMP=%TIMESTAMP: =0%"
  32. SET "TIMESTAMP=%TIMESTAMP:~4,-3%"
  33.  
  34. ECHO START: %DATE% %TIME% > "##_datetime.txt"
  35. ECHO( >>"##_datetime.txt"
  36. ECHO Comparing %file1% to %file2% >> "##_datetime.txt"
  37. ECHO( >>"##_datetime.txt"
  38.  
  39.  
  40. FOR %%I in ("%file1%") DO SET "fname1=%%~nI"
  41. FOR %%I in ("%file2%") DO SET "fname2=%%~nI"
  42.  
  43. SET "fname1=%fname1: =_%"
  44. SET "fname2=%fname2: =_%"
  45.  
  46. findstr /G:"excludecompare.txt" /V "%file1%" > "##_FILE1_clean.txt"
  47. findstr /G:"excludecompare.txt" /V "%file2%" > "##_FILE2_clean.txt"
  48.  
  49. CLS
  50. ECHO START: %DATE% %TIME%
  51. ECHO(
  52.  
  53. FOR /F %%a in ('Find "" /v /c ^< "##_FILE1_clean.txt"') DO (SET "line1=%%a")
  54. ECHO Number of files to process in %file1%: %line1%
  55.  
  56. FOR /F %%a in ('Find "" /v /c ^< "##_FILE2_clean.txt"') DO (SET "line2=%%a")
  57. ECHO Number of files to process in %file2%: %line2%
  58.  
  59. ECHO %file1%: %line1% hashes >> "##_datetime.txt"
  60. ECHO %file2%: %line2% hashes >> "##_datetime.txt"
  61. ECHO( >> "##_datetime.txt"
  62. ECHO ---------------------------------------------------------------- >> "##_datetime.txt"
  63. ECHO( >> "##_datetime.txt"
  64.  
  65. if %line1% GEQ %line2% (
  66. SET /A "fline=%line1%"
  67. SET "fname=%file1%"
  68. )
  69. if %line2% GEQ %line1% (
  70. SET /A "fline=%line2%"
  71. SET "fname=%file2%"
  72. )
  73. SET /A "fsizetime = fline / 1000"
  74. IF %fsizetime% EQU 0 SET "fsizetime = less than 1 minute"
  75.  
  76. (FOR /F "usebackq tokens=2 delims=," %%a in ("##_FILE1_clean.txt") do ECHO %%a)>"##_hash1.txt"
  77.  
  78. (FOR /F "usebackq tokens=2 delims=," %%a in ("##_FILE2_clean.txt") do ECHO %%a)>"##_hash2.txt"
  79. ECHO(
  80. ECHO ----------------------------------------------------------------
  81.  
  82. ECHO(
  83. ECHO Extracting NON-MATCHING Hashes:
  84. findstr /G:"##_hash1.txt" /V /I /L "##_FILE2_clean.txt" > "##_HASH_IN_FILE2_NOT_IN_FILE1.txt"
  85. findstr /G:"##_hash2.txt" /V /I /L "##_FILE1_clean.txt" > "##_HASH_IN_FILE1_NOT_IN_FILE2.txt"
  86.  
  87. ECHO(
  88.  
  89. ECHO NON-MATCHING HASHES with same path and filename (i.e. possibly corrupt or changed): > "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
  90. SET "none="
  91. (FOR /F "usebackq tokens=1-3 delims=," %%a in ("##_HASH_IN_FILE1_NOT_IN_FILE2.txt") DO (
  92. FOR /F "usebackq tokens=1-3 delims=," %%q in ("##_HASH_IN_FILE2_NOT_IN_FILE1.txt") DO (
  93. IF "%%c" EQU "%%s" (
  94. ECHO %file1%: %%b %%c %%a
  95. ECHO %file2%: %%r %%s %%q
  96. SET none=1
  97. ECHO(
  98. )
  99. )
  100.  
  101. )) >> "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
  102. IF NOT DEFINED none ECHO ALL CLEAR >>"##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
  103. ECHO(>> "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
  104.  
  105. TYPE "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
  106.  
  107. ECHO ----------------------------------------------------------------
  108. ECHO(
  109. ECHO ---------------------------------------------------------------- >> "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
  110. ECHO( >> "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
  111.  
  112. SET "none="
  113. ECHO Extracting MATCHING Hashes with NON-MATCHING Path/Filename (i.e. duplicate, moved, or renamed file):
  114. ECHO Note: This may take a while... estimate 1 minute per 1000 lines in largest log file:
  115. ECHO %fname%: %fline% lines / %fsizetime% minutes
  116. ECHO(
  117. ECHO MATCHING HASHES with NON-MATCHING Path/Filename (i.e. duplicate, moved, or renamed file): > "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
  118.  
  119. findstr /G:"##_hash1.txt" /I /L "##_FILE2_clean.txt" > "##_HASH_IN_FILE2_MATCHING_FILE1.txt"
  120. findstr /G:"##_hash2.txt" /I /L "##_FILE1_clean.txt" > "##_HASH_IN_FILE1_MATCHING_FILE2.txt"
  121.  
  122. (FOR /F "usebackq tokens=1-3 delims=," %%a in ("##_HASH_IN_FILE1_MATCHING_FILE2.txt") DO (
  123. FOR /F "usebackq tokens=1-3 delims=," %%q in ("##_HASH_IN_FILE2_MATCHING_FILE1.txt") DO (
  124. IF "%%b" EQU "%%r" (
  125. IF "%%c" NEQ "%%s" (
  126. ECHO %file1%: %%b %%c %%a
  127. ECHO %file2%: %%r %%s %%q
  128. SET "none=1"
  129. ECHO(
  130. )
  131. )
  132. )
  133.  
  134. )
  135. ) >> "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
  136. IF NOT DEFINED none ECHO ALL CLEAR >> "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
  137. ECHO(>> "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
  138. TYPE "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
  139.  
  140. ECHO ----------------------------------------------------------------
  141. ECHO ---------------------------------------------------------------- >> "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
  142. ECHO( >> "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
  143.  
  144.  
  145. ECHO Extracting Unique File Names:
  146. ECHO(
  147. ECHO Unique Hash/File Names in "%file1%": > "##_UNIQUE_FILES_FILE1.txt"
  148.  
  149. SET "nomatch="
  150. SET "none="
  151. (FOR /F "usebackq tokens=1-3 delims=," %%a in ("##_HASH_IN_FILE1_NOT_IN_FILE2.txt") DO (
  152. FOR /F "usebackq tokens=1-3 delims=," %%q in ("##_HASH_IN_FILE2_NOT_IN_FILE1.txt") DO (
  153. IF "%%c" EQU "%%s" SET nomatch=1
  154. )
  155. IF NOT DEFINED nomatch (
  156. ECHO %%b %%c %%a
  157. SET "none=1"
  158. )
  159. SET "nomatch="
  160. )) >> "##_UNIQUE_FILES_FILE1.txt"
  161. IF NOT DEFINED none ECHO ALL CLEAR >> "##_UNIQUE_FILES_FILE1.txt"
  162. ECHO(>> "##_UNIQUE_FILES_FILE1.txt"
  163. TYPE "##_UNIQUE_FILES_FILE1.txt"
  164.  
  165. ECHO ----------------------------------------------------------------
  166. ECHO ---------------------------------------------------------------- >> "##_UNIQUE_FILES_FILE1.txt"
  167. ECHO( >> "##_UNIQUE_FILES_FILE1.txt"
  168.  
  169. ECHO Unique Hash/File Names in "%file2%": > "##_UNIQUE_FILES_FILE2.txt"
  170. @ECHO OFF
  171. SET "nomatch="
  172. SET "none="
  173. (FOR /F "usebackq tokens=1-3 delims=," %%a in ("##_HASH_IN_FILE2_NOT_IN_FILE1.txt") DO (
  174. FOR /F "usebackq tokens=1-3 delims=," %%q in ("##_HASH_IN_FILE1_NOT_IN_FILE2.txt") DO (
  175. IF "%%c" EQU "%%s" SET nomatch=1
  176. )
  177. IF NOT DEFINED nomatch (
  178. ECHO %%b %%c %%a
  179. SET "none=1"
  180. )
  181. SET "nomatch="
  182. )) >> "##_UNIQUE_FILES_FILE2.txt"
  183. IF NOT DEFINED none ECHO ALL CLEAR >> "##_UNIQUE_FILES_FILE2.txt"
  184. ECHO(>> "##_UNIQUE_FILES_FILE2.txt"
  185. TYPE "##_UNIQUE_FILES_FILE2.txt"
  186.  
  187. ECHO ----------------------------------------------------------------
  188.  
  189. 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
  190.  
  191. ECHO ---------------------------------------------------------------- >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
  192. ECHO( >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
  193. ECHO OMITTED FILES CONTAINING (from 'excludecompare.txt'): >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
  194. TYPE excludecompare.txt >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
  195.  
  196. ECHO( >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
  197. ECHO( >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
  198. ECHO COMPLETE: %DATE% %TIME% >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
  199.  
  200. ECHO(
  201. ECHO RESULTS SAVED IN "%batchpath%#_HASHREPORT_%fname1%_vs_%fname2%_%TIMESTAMP%.txt"
  202.  
  203. REN "#_HASHREPORT_%fname1%_vs_%fname2%.txt" "#_HASHREPORT_%fname1%_vs_%fname2%_%TIMESTAMP%.txt"
  204.  
  205.  
  206.  
  207. REM Clean up log files
  208. DEL /Q ##_*.txt 2>NUL
  209.  
  210. ECHO(
  211. ECHO ** COMPLETE: %DATE% %TIME% **
  212.  
  213. GOTO :END
  214.  
  215. :END
  216. PAUSE
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement