Advertisement
HTWingNut

Compare two hash logs windows batch

May 24th, 2023 (edited)
109
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 10.29 KB | Software | 0 0
  1. @ECHO OFF
  2. REM comparehashfiles v1.0 by HTWingNut 04 JUN 2023
  3. REM To be used with hash files format 'hash path/to/file'.
  4. REM Example:
  5. REM 64079BC17DF119E0119782B783534929 folders.txt
  6.  
  7. REM *** USER INPUT REQUIRED:
  8. REM *** - create/edit file "excludecompare.ini" to add keyword tags
  9. REM *** for files to ignore if desired.
  10. REM *** One keyword per line, may include spaces.
  11.  
  12. SET "batchpath=%~dp0"
  13. CD /D "%batchpath%"
  14.  
  15. REM Cleaning up temp log files
  16. del ##_*.txt 2>NUL
  17.  
  18. REM Generate Time Stamp
  19. SET "STAMPDATE=%DATE:/=%"
  20. SET "STAMPTIME=%TIME::=%"
  21. SET "TIMESTAMP=%STAMPDATE: =_%_%STAMPTIME:.=_%"
  22. SET "TIMESTAMP=%TIMESTAMP: =0%"
  23. SET "TIMESTAMP=%TIMESTAMP:~4,-3%"
  24. SET "TIMESTAMP=%TIMESTAMP:~4,4%%TIMESTAMP:~0,4%_%TIMESTAMP:~-6%"
  25.  
  26. :start
  27. CLS
  28.  
  29. IF NOT EXIST "excludecompare.ini" (
  30. echo *** Generating keyword exclusion file: "excludecompare.ini"
  31. echo(>"excludecompare.ini"
  32. )
  33. echo *** Add any keywords to exclude from comparison in "excludecompare.ini" file.
  34. echo *** One keyword per line, can include spaces.
  35. echo *** NO BLANK LINES WITH ONLY SPACES OR TABS.
  36. echo *** Current exclusions in "excludecompare.ini" file:
  37. echo ------------------------------------------------------------------------------
  38. (for /f "usebackq eol= " %%z in ("excludecompare.ini") do break) && type excludecompare.ini || echo NONE
  39. ECHO(
  40. ECHO(
  41.  
  42. ECHO(
  43. ECHO *** Enter LOG FILE path information, relative or absolute.
  44. ECHO *** Log file format must be: [hash value] [relative\path\to\file]
  45. ECHO *** Current path: "%batchpath%"
  46. ECHO(
  47.  
  48. :enterfile1
  49. SET /P "file1=Enter Log File 1: "
  50. IF NOT EXIST "%file1%" ECHO *** FILE DOES NOT EXIST & GOTO :enterfile1
  51.  
  52. :lineskip1
  53. SET "skiplines1="
  54. SET "errorlevel="
  55. ECHO(
  56. ECHO First 10 Lines of Log File: '%file1%'
  57. findstr /n . "%file1%" | findstr "^[0-9]:"
  58. ECHO(
  59. ECHO Enter number of lines to skip at top of log file (ie header or non-hash info).
  60. CHOICE /C 0123456789 /N /M "Choose 0-9: "
  61. SET startline1=%errorlevel%
  62. SET /A skiplines1=%errorlevel% - 1
  63.  
  64.  
  65. ECHO(
  66. ECHO(
  67.  
  68. :enterfile2
  69. SET /P "file2=Enter Log File 2: "
  70. IF NOT EXIST "%file2%" ECHO *** FILE DOES NOT EXIST & GOTO :enterfile2
  71.  
  72. :lineskip2
  73. SET "skiplines2="
  74. SET "errorlevel="
  75. ECHO(
  76. ECHO First 10 Lines of Log File: '%file2%'
  77. findstr /n . "%file2%" | findstr "^[0-9]:"
  78. ECHO(
  79. ECHO Enter number of lines to skip at top of log file (ie header or non-hash info).
  80. CHOICE /C 0123456789 /N /M "Choose 0-9: "
  81. SET startline2=%errorlevel%
  82. SET /A skiplines2=%errorlevel% - 1
  83.  
  84.  
  85. ECHO(
  86.  
  87. ECHO START: %DATE% %TIME% > "##_datetime.txt"
  88. ECHO( >>"##_datetime.txt"
  89. ECHO Comparing %file1% to %file2% >> "##_datetime.txt"
  90. ECHO( >>"##_datetime.txt"
  91.  
  92. FOR %%I in ("%file1%") DO SET "fname1=%%~nI" & SET "fname1ext=%%~nxI"
  93. FOR %%I in ("%file2%") DO SET "fname2=%%~nI" & SET "fname2ext=%%~nxI"
  94. SET "fname1=%fname1: =_%"
  95. SET "fname2=%fname2: =_%"
  96.  
  97. SET "exclude=1"
  98.  
  99. ECHO(
  100.  
  101. ECHO *** File '%file1%':
  102. ECHO *** Skipping these lines:
  103. findstr /n . "%file1%" | findstr "^[0-%skiplines1%]:"
  104. ECHO(
  105. ECHO *** Starting with line:
  106. findstr /n . "%file1%" | findstr "^[%startline1%]:"
  107. ECHO(
  108. ECHO(
  109.  
  110.  
  111. ECHO *** File '%file2%':
  112. ECHO *** Skipping these lines:
  113. findstr /n . "%file2%" | findstr "^[0-%skiplines2%]:"
  114. ECHO(
  115. ECHO *** Starting with line:
  116. findstr /n . "%file2%" | findstr "^[%startline2%]:"
  117.  
  118. ECHO(
  119. SET "continue="
  120. SET /P "continue=OK? [ENTER] to continue or N to change: "
  121.  
  122. IF defined continue CLS & GOTO :start
  123.  
  124.  
  125. FOR /f %%a in ('find "" /v /c ^< "excludecompare.ini"') do (set "linescomp=%%a")
  126. IF %linescomp% equ 0 SET "exclude="
  127.  
  128. IF DEFINED exclude (
  129. findstr /I /G:"excludecompare.ini" /V "%file1%" > "##_FILE1_clean_p.txt"
  130. findstr /I /G:"excludecompare.ini" /V "%file2%" > "##_FILE2_clean_p.txt"
  131. )
  132.  
  133. IF NOT DEFINED exclude (
  134. more "%file1%" > "##_FILE1_clean_p.txt"
  135. more "%file2%" > "##_FILE2_clean_p.txt"
  136. )
  137.  
  138. @echo on
  139. more +%skiplines1% "##_FILE1_clean_p.txt" > "##_FILE1_clean.txt"
  140. more +%skiplines2% "##_FILE2_clean_p.txt" > "##_FILE2_clean.txt"
  141. @echo off
  142.  
  143. CLS
  144. ECHO START: %DATE% %TIME%
  145. ECHO(
  146.  
  147. FOR /F %%a in ('Find "" /v /c ^< "##_FILE1_clean.txt"') DO (SET "line1=%%a")
  148. ECHO Number of files to process in %fname1ext%: %line1%
  149.  
  150. FOR /F %%a in ('Find "" /v /c ^< "##_FILE2_clean.txt"') DO (SET "line2=%%a")
  151. ECHO Number of files to process in %fname2ext%: %line2%
  152.  
  153. ECHO %file1%: %line1% hashes >> "##_datetime.txt"
  154. ECHO %file2%: %line2% hashes >> "##_datetime.txt"
  155. ECHO( >> "##_datetime.txt"
  156. ECHO ---------------------------------------------------------------- >> "##_datetime.txt"
  157. ECHO( >> "##_datetime.txt"
  158.  
  159. if %line1% GEQ %line2% (
  160. SET /A "fline=%line1%"
  161. SET "fname=%file1%"
  162. )
  163. if %line2% GEQ %line1% (
  164. SET /A "fline=%line2%"
  165. SET "fname=%file2%"
  166. )
  167. SET /A "fsizetime = fline / 1000"
  168. IF %fsizetime% EQU 0 SET "fsizetime = less than 1 minute"
  169.  
  170. (FOR /F "usebackq tokens=1 delims= " %%a in ("##_FILE1_clean.txt") do ECHO %%a)>"##_hash1.txt"
  171.  
  172. (FOR /F "usebackq tokens=1 delims= " %%a in ("##_FILE2_clean.txt") do ECHO %%a)>"##_hash2.txt"
  173. ECHO(
  174. ECHO ----------------------------------------------------------------
  175.  
  176. ECHO(
  177. ECHO Extracting NON-MATCHING Hashes:
  178. findstr /G:"##_hash1.txt" /V /I /L "##_FILE2_clean.txt" > "##_HASH_IN_FILE2_NOT_IN_FILE1.txt"
  179. findstr /G:"##_hash2.txt" /V /I /L "##_FILE1_clean.txt" > "##_HASH_IN_FILE1_NOT_IN_FILE2.txt"
  180.  
  181. ECHO(
  182.  
  183. ECHO NON-MATCHING HASHES with same path and filename (i.e. modified or possibly corrupt): > "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
  184. SET "none="
  185. (FOR /F "usebackq tokens=1,* delims= " %%a in ("##_HASH_IN_FILE1_NOT_IN_FILE2.txt") DO (
  186. FOR /F "usebackq tokens=1,* delims= " %%q in ("##_HASH_IN_FILE2_NOT_IN_FILE1.txt") DO (
  187. IF ["%%b"] EQU ["%%r"] (
  188. ECHO %fname1ext%: %%a %%b
  189. ECHO %fname2ext%: %%q %%r
  190. SET none=1
  191. ECHO(
  192. )
  193. )
  194.  
  195. )) >> "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
  196. IF NOT DEFINED none ECHO ALL CLEAR >>"##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
  197. ECHO(>> "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
  198.  
  199. TYPE "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
  200.  
  201. ECHO ----------------------------------------------------------------
  202. ECHO(
  203. ECHO ---------------------------------------------------------------- >> "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
  204. ECHO( >> "##_SAME_FILENAME_NONMATCHING_HASH_FILE1_FILE2.txt"
  205.  
  206. SET "none="
  207. ECHO Extracting MATCHING Hashes with NON-MATCHING Path/Filename (i.e. duplicate, moved, or renamed file):
  208. ECHO Note: This may take a while... estimate 1 minute per 1000 lines in largest log file:
  209. ECHO %fname%: %fline% lines / %fsizetime% minutes
  210. ECHO(
  211. ECHO MATCHING HASHES with NON-MATCHING Path/Filename (i.e. duplicate, moved, or renamed file): > "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
  212.  
  213. findstr /G:"##_hash1.txt" /I /L "##_FILE2_clean.txt" > "##_HASH_IN_FILE2_MATCHING_FILE1.txt"
  214. findstr /G:"##_hash2.txt" /I /L "##_FILE1_clean.txt" > "##_HASH_IN_FILE1_MATCHING_FILE2.txt"
  215.  
  216.  
  217.  
  218. (FOR /F "usebackq tokens=1,* delims= " %%a in ("##_HASH_IN_FILE1_MATCHING_FILE2.txt") DO (
  219. FOR /F "usebackq tokens=1,* delims= " %%q in ("##_HASH_IN_FILE2_MATCHING_FILE1.txt") DO (
  220. IF ["%%a"] EQU ["%%q"] (
  221. IF ["%%b"] NEQ ["%%r"] (
  222. ECHO %fname1ext%: %%a %%b
  223. ECHO %fname2ext%: %%q %%r
  224. SET "none=1"
  225. ECHO(
  226. )
  227. )
  228. )
  229.  
  230. )
  231. ) >> "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
  232. IF NOT DEFINED none ECHO ALL CLEAR >> "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
  233. ECHO(>> "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
  234. TYPE "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
  235.  
  236. ECHO ----------------------------------------------------------------
  237. ECHO ---------------------------------------------------------------- >> "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
  238. ECHO( >> "##_SAME_HASH_NONMATCHING_FILENAME_FILE1_FILE2.txt"
  239.  
  240.  
  241. ECHO Extracting Unique File Names:
  242. ECHO(
  243. ECHO Unique Hash/File Names in "%fname1ext%": > "##_UNIQUE_FILES_FILE1.txt"
  244.  
  245. SET "nomatch="
  246. SET "none="
  247. (FOR /F "usebackq tokens=1-3 delims=," %%a in ("##_HASH_IN_FILE1_NOT_IN_FILE2.txt") DO (
  248. FOR /F "usebackq tokens=1,* delims= " %%q in ("##_HASH_IN_FILE2_NOT_IN_FILE1.txt") DO (
  249. IF ["%%b"] EQU ["%%r"] SET nomatch=1
  250. )
  251. IF NOT DEFINED nomatch (
  252. ECHO %%a %%b
  253. SET "none=1"
  254. )
  255. SET "nomatch="
  256. )) >> "##_UNIQUE_FILES_FILE1.txt"
  257. IF NOT DEFINED none ECHO ALL CLEAR >> "##_UNIQUE_FILES_FILE1.txt"
  258. ECHO(>> "##_UNIQUE_FILES_FILE1.txt"
  259. TYPE "##_UNIQUE_FILES_FILE1.txt"
  260.  
  261. ECHO ----------------------------------------------------------------
  262. ECHO ---------------------------------------------------------------- >> "##_UNIQUE_FILES_FILE1.txt"
  263. ECHO( >> "##_UNIQUE_FILES_FILE1.txt"
  264.  
  265. ECHO Unique Hash/File Names in "%fname2ext%": > "##_UNIQUE_FILES_FILE2.txt"
  266. @ECHO OFF
  267. SET "nomatch="
  268. SET "none="
  269. (FOR /F "usebackq tokens=1,* delims= " %%a in ("##_HASH_IN_FILE2_NOT_IN_FILE1.txt") DO (
  270. FOR /F "usebackq tokens=1,* delims= " %%q in ("##_HASH_IN_FILE1_NOT_IN_FILE2.txt") DO (
  271. IF ["%%a"] EQU ["%%q"] SET nomatch=1
  272. )
  273. IF NOT DEFINED nomatch (
  274. ECHO %%a %%b
  275. SET "none=1"
  276. )
  277. SET "nomatch="
  278. )) >> "##_UNIQUE_FILES_FILE2.txt"
  279. IF NOT DEFINED none ECHO ALL CLEAR >> "##_UNIQUE_FILES_FILE2.txt"
  280. ECHO(>> "##_UNIQUE_FILES_FILE2.txt"
  281. TYPE "##_UNIQUE_FILES_FILE2.txt"
  282.  
  283. ECHO ----------------------------------------------------------------
  284.  
  285. 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
  286.  
  287. ECHO ---------------------------------------------------------------- >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
  288. ECHO( >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
  289. ECHO OMITTED ENTRIES CONTAINING (from 'excludecompare.ini'): >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
  290. TYPE excludecompare.ini >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
  291.  
  292. ECHO( >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
  293. ECHO( >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
  294. ECHO COMPLETE: %DATE% %TIME% >> "#_HASHREPORT_%fname1%_vs_%fname2%.txt"
  295.  
  296. ECHO(
  297. ECHO RESULTS SAVED IN "%batchpath%#_HASHREPORT_%fname1%_vs_%fname2%_%TIMESTAMP%.txt"
  298.  
  299. REN "#_HASHREPORT_%fname1%_vs_%fname2%.txt" "#_HASHREPORT_%fname1%_vs_%fname2%_%TIMESTAMP%.txt"
  300.  
  301. GOTO :END
  302.  
  303. :END
  304.  
  305. REM Clean up log files
  306. DEL /Q ##_*.txt 2>NUL
  307.  
  308. ECHO(
  309. ECHO ** COMPLETE: %DATE% %TIME% **
  310. ECHO(
  311.  
  312. PAUSE
  313.  
  314. EXIT
  315.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement