HTWingNut

WINDOWS BATCH HASHDEEP64

Jan 10th, 2022 (edited)
428
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 14.45 KB | None | 0 0
  1. NOTES:
  2. 11 JANUARY 2022
  3. BELOW IS A WINDOWS BATCH FILE THAT MAKES USE OF HASHDEEP FOR GENERATING AND VALIDATING MD5 HASHES OF FILES IN SPECIFIED FOLDER (INCLUDING ALL SUBFOLDERS).
  4.  
  5. HASHDEEP IS OPEN SOURCE AND FREELY DISTRIBUATABLY, DOWNLOAD FROM GITHUB (VERSION 4.4): https://github.com/jessek/hashdeep/
  6.  
  7. YOU WILL ONLY NEED THE FILE 'HASHDEEP64.EXE' WHICH SHOULD BE PLACED IN THE SAME FOLDER AS THE BELOW BATCH FILE.
  8.  
  9. WHEN GENERATING HASHES, THE HASH FILE WILL BE STORED IN THE SAME FOLDER THE BATCH FILE IS PLACED AND WILL MAKE A "LOGS" SUB FOLDER WHERE ALL LOG FILES WILL BE STORED WITH THE FILE NAME MASK "[FOLDERNAME]_[DATESTAMP]_FULLHASHLIST.TXT". DATESTAMP WILL USE YYYYMMDD FORMAT. FILENAME CAN BE CHANGED TO WHATEVER YOU WISH AFTER CHECKSUMS ARE GENERATED. (I.E. BACKUPS_20220110_FULLHASHLIST.TXT)
  10.  
  11. WHEN YOU PERFORM A COMPARISON OF A PREVIOUS HASH LIST TO ANOTHER FOLDER, THE FILE MUST BE PLACED IN THE SAME FOLDER THE BATCH FILE EXISTS, UNDER THE LOGS SUBFOLDER, AND TYPE FULL NAME OF FILE WITH EXTENSION (I.E. .TXT). AFTER HASHES ARE COMPARED IT WILL GENERATE A FILE IN THE LOGS SUBFOLDER WITH THE FILE NAME MASK "[FOLDERNAME]_[DATESTAMP]_FULLHASHSUMMARY.TXT" (I.E. BACKUPS_20220110_FULLHASHSUMMAR.TXT)
  12.  
  13. IF NO ISSUES ARE FOUND THE REPORT WILL SAY "PASSED: NO ISSUES FOUND"
  14.  
  15. IF THERE ARE DISCREPENCIES IT WILL SHOW FOUR CATGORIES:
  16. 1. FILENAMES WITH HASHES BUT DIFFERENT FILENAME (LIKELY MOVED/RENAMED)
  17. 2. FILES WITH SAME FILENAME BUT DIFFERENT HASH (LIKELY MODIFIED OR CORRUPT)
  18. 3. FILENAMES IN CHECKED DIRECTORY WITH NO MATCHING HASH (LIKELY NEW *OR* NAME CHANGED WITH CONTENTS MODIFIED OR CORRUPT)
  19. 4. FILENAMES WITH HASH THAT DO NOT EXIST IN CHECKED DIRECTORY (LIKELY DELETED OR MOVED OUTSIDE OF CHECKED DIRECTORY)
  20.  
  21. IF THERE ARE NO FILES LISTED THEN THERE WERE NO ISSUES WITH THAT PARTICULAR CATEGORY.
  22.  
  23. THE PROGRAM WILL SCAN THE FOLDER ENTERED BY THE USER FOR TOTAL FILE SIZE, TOTAL NUMBER OF FILES, AND TOTAL NUMBER OF FOLDERS WITH A TIME ESTIMATE TO COMPLETE ASSUMING 100MB/SEC. THIS IS NOT NECESSARY AND CAN TAKE A LITTLE WHILE IF YOU HAVE A LOT OF FILES, BUT INCLUDED IT BECAUSE PERSONALLY I LIKE TO HAVE THIS INFORMATION. YOU CAN REMOVE THIS FUNCTION IF DESIRED BY REMARKING OUT THE LINE (THERE ARE TWO, ONE FOR INITIAL CHECKSUM, SECOND FOR VALIDATION):
  24.  
  25. CALL :foldersize
  26.  
  27. BELOW IS THE BATCH FILE. COPY/PASTE EVERYTHING BELOW THE ####### MARKS INTO A NOTEPAD DOCUMENT AND SAVE AS "HASHDEEPBATCH.BAT". YOU CAN NAME IT WHATEVER YOU WANT THOUGH. JUST BE SURE HASHDEEP64.EXE EXISTS IN SAME FOLDER WHEREVER YOU PUT BATCH FILE.
  28.  
  29. ####################################################
  30.  
  31. @ECHO OFF
  32.  
  33. :START
  34. cls
  35.  
  36. REM Set current folder to batch folder
  37. CALL :CLEARSET
  38. set "batchdir=%~dp0"
  39. cd /d "%batchdir%"
  40. IF NOT EXIST "LOGS\" MD "LOGS\"
  41.  
  42. if not exist "%batchdir%hashdeep64.exe" ECHO Make sure the file "hashdeep64" are in your system path or same folder as this batch file & ECHO,
  43.  
  44. ECHO ****************************************************************************************
  45. ECHO * HASHDEEPBATCH by HTWINGNUT 10 JAN 2022 *
  46. ECHO * - HASHDEEP MD5 Checksum Hash and Validation of Files *
  47. ECHO * *
  48. ECHO * !!! USE AT YOUR OWN RISK. I TAKE NO RESPONSIBILITY ANY ERRORS OR ISSUES !!! *
  49. ECHO * *
  50. ECHO * THIS BATCH FILE REQUIRES: *
  51. ECHO * - HASHDEEP64.EXE from http://md5deep.sourceforge.net/ or *
  52. ECHO * https://github.com/jessek/hashdeep *
  53. ECHO * *
  54. ECHO ****************************************************************************************
  55. ECHO,
  56.  
  57. REM SET DAY TIME STAMP STORED IN %logtime% VARIABLE
  58.  
  59. REM Determine if hour is one or two digits
  60. set hournum=%time:~0,2%
  61. set logdate=%date:~10,4%%date:~4,2%%date:~7,2%
  62.  
  63. REM Set up filename depending on time is one or two digits
  64. if %hournum% gtr 9 (set logtime=%date:~10,4%%date:~4,2%%date:~7,2%_%time:~0,2%%time:~3,2%%time:~6,2%) else (set logtime=%date:~10,4%%date:~4,2%%date:~7,2%_0%time:~1,1%%time:~3,2%%time:~6,2%)
  65.  
  66. ECHO,
  67. ECHO Do you want to:
  68. ECHO [H]ash all the files in a specified folder
  69. ECHO [C]ompare hashes of a folder with a previously hashed set of files
  70. ECHO e[X]it
  71. ECHO,
  72. CHOICE /C HCX /N /M "[H]ash, [C]ompare, or e[X]it > "
  73. IF %ERRORLEVEL% EQU 1 GOTO :hashit
  74. IF %ERRORLEVEL% EQU 2 GOTO :HASHCHECK
  75. IF %ERRORLEVEL% EQU 3 GOTO :DONE
  76.  
  77. REM *************************************************************
  78. REM Independent Hash Routine Using HASHDEEP
  79. :HASHIT
  80. CLS
  81. :HASHNEW
  82.  
  83. set "sourcedir="
  84. ECHO,
  85. ECHO Entering path and pressing [ ENTER ] will immediately start hash calcuations.
  86. ECHO,
  87. set /p "sourcedir=Full Path of Directory to Hash (x to exit) > "
  88. IF /I "%sourcedir%" == "x" GOTO :START
  89. IF NOT ["%sourcedir%"]==[""] GOTO :checkh1
  90. ECHO,
  91. ECHO *** No Path Entered
  92. ECHO *** Please enter full directory path (i.e. C:\ D:\archive etc)
  93. ECHO,
  94. GOTO :HASHNEW
  95.  
  96. :checkh1
  97. if exist "%sourcedir%\" goto :HASHSTART
  98. ECHO,
  99. ECHO *** No such path exists.
  100. ECHO *** Please enter full directory path (i.e. C:\ D:\archive etc)
  101. ECHO,
  102.  
  103. GOTO :HASHNEW
  104.  
  105. :HASHSTART
  106. CLS
  107. CALL :HASHSUB
  108. PAUSE
  109. GOTO :START
  110.  
  111.  
  112.  
  113. REM *************************************************************
  114.  
  115. :HASHCHECK
  116. CLS
  117. :hashcheck2
  118. ECHO,
  119. set /p sourcedir="Full Path of Directory to Check Hash (x to exit) > "
  120. IF ["%sourcedir%"] EQU ["x"] GOTO :START
  121. IF NOT ["%sourcedir%"]==[""] GOTO :hashcheck3
  122. ECHO,
  123. ECHO *** No Path Entered
  124. ECHO *** Please enter full directory path (i.e. C:\ D:\archive etc)
  125. ECHO,
  126. GOTO :hashcheck2
  127.  
  128. :hashcheck3
  129. if exist "%sourcedir%\" goto :hashcheck4
  130. ECHO,
  131. ECHO *** No such path exists.
  132. ECHO *** Please enter full directory path (i.e. C:\ D:\archive etc)
  133. ECHO,
  134. GOTO :hashcheck2
  135.  
  136. :hashcheck4
  137. CALL :hashfilecheck
  138.  
  139. REM !!! REMARK OUT OR DELETE BELOW CALL LINE IF YOU DO NOT WANT FOR FILE STATS TO RUN
  140. CALL :foldersize
  141. ECHO,
  142. PAUSE
  143.  
  144. :HASHCHECKSTART
  145. CALL :SDIRLEN
  146. CD /D "%batchdir%"
  147. ECHO,
  148. ECHO REFERENCING FILE: "%hashfilen%"
  149. ECHO VERIFY HASH OF FILES IN: "%sourcedir%"
  150. ECHO,
  151. ECHO,
  152. ECHO Validating Checksums...
  153. ECHO,
  154.  
  155. REM *************************************************************
  156. REM START HASHCHECK
  157.  
  158.  
  159. pushd "%sourcedir%"
  160. "%batchdir%hashdeep64.exe" -k "%batchdir%LOGS\%hashfilen%" -avv -of -elr * > "%batchdir%hashauditraw.txt"
  161. popd
  162.  
  163. REM This was used when _ZIPHASHBURN_ folder was in same folder as data, not needed anymore.
  164. REM findstr /V C:"_ZIPHASHBURN_" "hashauditraw_.txt" > hashauditraw.txt
  165.  
  166. REM del /q /f "hashauditraw_.txt"
  167.  
  168. del __hash*.txt 2>NUL
  169. REM.>__hashnomatch.txt
  170. REM.>__hashnomatchfiles.txt
  171. REM.>__hashnotused.txt
  172. REM.>__hashnotusedfiles.txt
  173.  
  174. SET "hashsummary=%batchdir%LOGS\%folderzip%_%logtime%_FULLHASHSUMMARY.TXT"
  175.  
  176. ECHO *** %date% %time% >> %hashsummary%
  177. ECHO *** USING HASH FILE: "%hashfilen%" >> %hashsummary%
  178. ECHO *** CHECKING FOLDER: "%sourcedir%" >> %hashsummary%
  179. ECHO, >> %hashsummary%
  180.  
  181. SET "PASSED="
  182. FOR /F "tokens=*" %%a in ('FINDSTR /C:".exe\: Audit Passed" /L /I "hashauditraw.txt"') DO ( SET "PASSED=%%a" )
  183. IF DEFINED PASSED (
  184. ECHO *** PASSED: NO ISSUES FOUND
  185. ECHO *** PASSED: NO ISSUES FOUND >> %hashsummary%
  186. GOTO :HCHECKDONE
  187. )
  188.  
  189. ECHO *** FILENAMES WITH MATCHING HASHES BUT DIFFERENT FILENAMES (LIKELY MOVED/RENAMED) >> %hashsummary%
  190. FINDSTR /C:": Moved from" /I hashauditraw.txt >> %hashsummary%
  191. ECHO, >> %hashsummary%
  192. ECHO, >> %hashsummary%
  193. ECHO *** FILES WITH SAME FILENAME BUT DIFFERENT HASH (LIKELY MODIFIED OR CORRUPT) >> %hashsummary%
  194.  
  195.  
  196. FINDSTR /C:": No match" /I hashauditraw.txt > __hashnomatch.txt
  197. FOR /F "usebackq tokens=1* delims=:" %%Q in ("__hashnomatch.txt") DO (echo %%Q) >> __hashnomatchfiles.txt
  198.  
  199. FINDSTR /C:": Known file not used" /I hashauditraw.txt > __hashnotused.txt
  200. FOR /F "usebackq tokens=1* delims=:" %%R in ("__hashnotused.txt") DO (echo %%R) >> __hashnotusedfiles.txt
  201.  
  202.  
  203. FOR /F "usebackq delims=" %%S in ("__hashnotusedfiles.txt") DO (
  204. FOR /F "usebackq delims=" %%T in ("__hashnomatchfiles.txt") DO (
  205. IF ["%%S"] EQU ["%%T"] ECHO %%S >> %hashsummary%
  206. )
  207. )
  208.  
  209. ECHO, >> %hashsummary%
  210. ECHO, >> %hashsummary%
  211. ECHO *** FILENAMES IN CHECKED DIRECTORY WITH NO MATCHING HASH (LIKELY NEW *OR* NAME CHANGED WITH CONTENTS MODIFIED OR CORRUPT) >> %hashsummary%
  212.  
  213. SET FOUND=0
  214. FOR /F "usebackq delims=" %%U in ("__hashnomatchfiles.txt") DO (
  215. SETLOCAL ENABLEDELAYEDEXPANSION
  216. FOR /F "usebackq delims=" %%V in ("__hashnotusedfiles.txt") DO (
  217. IF ["%%U"] EQU ["%%V"] SET FOUND=1
  218. )
  219. IF !FOUND! EQU 1 (ECHO,) ELSE (
  220. SET FOUND=0
  221. ECHO %%U >> %hashsummary%
  222. )
  223. ENDLOCAL
  224. )
  225.  
  226. ECHO, >> %hashsummary%
  227. ECHO, >> %hashsummary%
  228. ECHO *** FILENAMES WITH HASH THAT DO NOT EXIST IN CHECKED DIRECTORY (LIKELY DELETED OR MOVED OUTSIDE OF CHECKED DIRECTORY) >> %hashsummary%
  229.  
  230. SET FOUND=0
  231. FOR /F "usebackq delims=" %%W in ("__hashnotusedfiles.txt") DO (
  232. SETLOCAL ENABLEDELAYEDEXPANSION
  233. FOR /F "usebackq delims=" %%X in ("__hashnomatchfiles.txt") DO (
  234. IF ["%%W"] EQU ["%%X"] SET FOUND=1
  235. )
  236. IF !FOUND! EQU 1 (ECHO,) ELSE (
  237. SET FOUND=0
  238. ECHO %%W >> %hashsummary%
  239. )
  240. ENDLOCAL
  241. )
  242.  
  243.  
  244.  
  245. :HCHECKDONE
  246. del __hash*.txt 2>NUL
  247. ECHO,
  248. ECHO HASH CHECK COMPLETE!
  249. ECHO,
  250. ECHO Results are stored in "%hashsummary%"
  251. ECHO CONTENTS OF FILE BELOW:
  252. ECHO,
  253. TYPE "%hashsummary%"
  254. ECHO,
  255. ECHO,
  256. ECHO **************************************************************
  257. ECHO *** PRESSING [ ENTER ] WILL TAKE YOU BACK TO THE MAIN MENU ***
  258. ECHO **************************************************************
  259. ECHO,
  260.  
  261. pause
  262.  
  263. GOTO :START
  264.  
  265.  
  266. REM *************************************************************
  267. :HASHSUB
  268. CALL :SDIRLEN
  269.  
  270. REM !!! REMARK OUT OR DELETE BELOW CALL LINE IF YOU DO NOT WANT FOR FILE STATS TO RUN
  271. CALL :FOLDERSIZE
  272. ECHO,
  273. PAUSE
  274.  
  275. :HASHSUB_1
  276. ECHO,
  277. ECHO STARTING HASH OF ALL FILES AND FOLDERS UNDER "%sourcedir%"
  278. ECHO %DATE% %TIME%
  279. ECHO,
  280. ECHO,
  281. SET "HASHLOG=LOGS\%folderzip%%fileext%_%logtime%_FULLHASHLIST.txt"
  282. REM TYPE NUL>hashlisttemp.txt
  283. pushd %sourcedir%
  284. "%batchdir%hashdeep64.exe" -cmd5 -of -elr * > "%batchdir%%HASHLOG%"
  285. popd
  286.  
  287. ECHO,
  288. ECHO HASH COMPLETE!
  289. ECHO %DATE% %TIME%
  290. ECHO,
  291. ECHO Hash values are stored in "%batchdir%%HASHLOG%"
  292. ECHO KEEP THIS FILE FOR FUTURE HASH VALIDATION
  293. ECHO,
  294.  
  295. GOTO :EOF
  296.  
  297.  
  298. REM *************************************************************
  299. :hashfilecheck
  300. ECHO,
  301. ECHO The reference file should be in the same folder as this batch file under the LOGS folder:
  302. ECHO "%batchdir%LOGS\"
  303. ECHO,
  304. PUSHD "LOGS\"
  305. set /p hashfilen="Name of File Containing Hashes to Verify (x to exit) > "
  306. IF ["%hashfilen%"] EQU ["x"] (
  307. POPD
  308. GOTO :START
  309. )
  310. IF NOT ["%hashfilen%"]==[""] GOTO :hashcheck1
  311. ECHO,
  312. ECHO *** No Filename Entered
  313. ECHO *** Please verify and re-enter filename
  314. ECHO,
  315. GOTO :hashfilecheck
  316.  
  317. :hashcheck1
  318. if exist "%hashfilen%" (
  319. if exist "%hashfilen%\" ( ECHO >NUL ) ELSE (
  320. POPD
  321. GOTO :EOF
  322. )
  323. )
  324. ECHO,
  325. ECHO *** No such file exists.
  326. ECHO *** Please re-enter proper filename located in same folder as this batch file
  327. ECHO,
  328. POPD
  329. GOTO :hashfilecheck
  330.  
  331. REM DEBUG: broke through hashfilecheck subroutine
  332. pause
  333.  
  334. REM ########
  335. :DONE
  336. ENDLOCAL
  337. EXIT
  338.  
  339.  
  340. REM ########
  341. :FOLDERSIZE
  342. set "tsize=0"
  343. set "tsizemb=0"
  344. set "tsizebyte=0"
  345. set "fsizemb=0"
  346. set "fsizebyte=0"
  347. set "size=0"
  348. set "folder=%sourcedir%"
  349. set "filecount=0"
  350. set "foldcount=0"
  351. set "fpath_="
  352. set "tsizegb=0"
  353. set "tsizemb_=0"
  354. set "speed=0"
  355.  
  356. ECHO %date% %time% >fsize.log
  357.  
  358. REM COUNT FILES
  359.  
  360. REM for /r "%folder%" %%x in ("*") do (
  361.  
  362. for /f "tokens=* delims=" %%x in ('dir /b /s /a:-d "%folder%\*"') do (
  363. set "fsize=%%~zx"
  364. set "file=%%~pnxx"
  365. set "fpath=%%~px"
  366. call :addfiles
  367. )
  368.  
  369. ECHO,
  370. REM COUNT DIRECTORIES
  371.  
  372. For /f %%d in ('dir /b /s /a:d "%folder%"^|find /c /v ""') do CALL :addfolders %%d
  373.  
  374. CLS
  375.  
  376. ECHO FINISHED SCANNING: "%folder%"
  377. ECHO,
  378. SET tsizemb_=%tsizemb:~-3%
  379. IF %tsizemb% GEQ 1000 SET tsizegb=%tsizemb:~0,-3%
  380. ECHO TOTAL SIZE: %tsizemb%%tsizebyte:~-6% bytes (%tsizegb%.%tsizemb_% GB)
  381. ECHO TOTAL FILES: %filecount%
  382. ECHO TOTAL FOLDERS: %foldcount%
  383. ECHO,
  384. SET /A SPEED=%tsizemb%/6000
  385. IF %SPEED% EQU 0 SET "SPEED=LESS THAN 1"
  386. ECHO APPROXIMATE TIME TO CHECKSUM ALL FILES (at 100 MB/sec): %SPEED% MINUTES
  387.  
  388. GOTO :EOF
  389.  
  390. :addfiles
  391. SET "fsizemb=0"
  392. IF ["%fpath_%"] NEQ ["%fpath%"] (
  393. CALL :SHOWPATH
  394. )
  395. IF %fsize% GEQ 1000000 SET "fsizemb=%fsize:~0,-6%"
  396. SET "fsizebyte=%fsize:~-6%"
  397. FOR /F "tokens=* delims=0" %%a in ("%fsizebyte%") DO SET fsizebyte=%%a
  398. IF [%fsizebyte%] EQU [] SET fsizebyte=0
  399.  
  400. SET /A filecount+=1
  401. SET /A tsizemb+=%fsizemb%
  402. SET /A tsizebyte+=%fsizebyte%
  403.  
  404. IF %tsizebyte% GEQ 1000000 CALL :RESETBYTE
  405. GOTO :EOF
  406.  
  407. :addfolders
  408. SET foldcount=%1
  409. GOTO :EOF
  410.  
  411. :RESETBYTE
  412. SET /A tsizemb+=%tsizebyte:~0,-6%
  413. SET tsizebyte=%tsizebyte:~-6%
  414. REM ECHO tsizebyte %tsizebyte%
  415. FOR /F "tokens=* delims=0" %%a in ("%tsizebyte%") DO SET tsizebyte=%%a
  416. IF [%tsizebyte%] EQU [] SET tsizebyte=0
  417. GOTO :EOF
  418.  
  419. :SHOWPATH
  420. SET "fpath_=%fpath%"
  421. CLS
  422. ECHO SCANNING: %fpath_%
  423. GOTO :EOF
  424.  
  425.  
  426. REM ########
  427. :SDIRLEN
  428. SET "folderzip="
  429. SET "sd=%sourcedir:~0,1%"
  430. SET "pathtemp=%sourcedir:~-1%"
  431. IF ["%pathtemp%"] EQU ["\"] (set "sourcedir=%sourcedir%") ELSE (set "sourcedir=%sourcedir%\")
  432. FOR %%i in ("%sourcedir:~0,-1%") DO (SET "folderzip=%%~nxi")
  433. SET "folderzip=%folderzip: =_%"
  434. REM USE BELOW IF YOU WANT TO INCLUDE DRIVE LETTER
  435. REM SET "folderzip=%sd%_%folderzip%"
  436.  
  437. CALL :STRLEN "%sourcedir%" _sdlen
  438.  
  439. ECHO,
  440.  
  441. GOTO :EOF
  442.  
  443.  
  444. REM ########
  445. :CLEARSET
  446. SET "_sdeln="
  447. SET "batchdir="
  448. SET "count="
  449. SET "fileext="
  450. SET "filepath="
  451. SET "folderzip="
  452. SET "FOUND="
  453. SET "hashfilen="
  454. SET "HASHLOG="
  455. SET "hashsummary="
  456. SET "hournum="
  457. SET "len="
  458. SET "logtime="
  459. SET "logdate="
  460. SET "PASSED="
  461. SET "password="
  462. SET "pathtemp="
  463. SET "sourcedir="
  464.  
  465. set "tsizemb="
  466. set "tsizebyte="
  467. set "fsizemb="
  468. set "fsizebyte="
  469. set "size="
  470. set "filecount="
  471. set "foldcount="
  472. set "fpath_="
  473. set "tsizegb="
  474. set "tsizemb_="
  475. set "speed="
  476. GOTO :EOF
  477.  
  478. REM ########
  479. :STRLEN
  480. Setlocal EnableDelayedExpansion
  481. :: strLen String [RtnVar]
  482. :: -- String The string to be measured, surround in quotes if it contains spaces.
  483. :: -- RtnVar An optional variable to be used to return the string length.
  484. Set "s=#%~1"
  485. Set "len=0"
  486. For %%N in (4096 2048 1024 512 256 128 64 32 16 8 4 2 1) do (
  487. if "!s:~%%N,1!" neq "" (
  488. set /a "len+=%%N"
  489. set "s=!s:~%%N!"
  490. )
  491. )
  492. Endlocal&if "%~2" neq "" (set %~2=%len%) else echo %len%
  493. GOTO :EOF
Add Comment
Please, Sign In to add comment