Advertisement
Guest User

Untitled

a guest
Sep 17th, 2017
53
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. @echo off
  2. set id=0
  3. Setlocal EnableDelayedExpansion
  4. cls
  5. echo This script can only check up to 9 disks at once
  6. set /p in=Press enter to Continue
  7. if not exist logs mkdir logs
  8. if not exist logs\%COMPUTERNAME% mkdir logs\%COMPUTERNAME%
  9. for /f "tokens=5,6,7,8 delims=:. " %%G in ('echo.^|time') do (
  10.     set time=%%G%%H%%I%%J
  11. )
  12. for /f "tokens=2,3,4 delims=/ " %%G in ('date /t') do (
  13.     set date=%%G%%H%%I
  14. )
  15. set fname=smartcheck-%date%%time%.log
  16. for /f "tokens=5" %%G in ('echo.^|time') do (
  17.     set time=%%G
  18. )
  19. for /f "tokens=4,5,6" %%G in ('echo.^|date') do (
  20.     set %%G=%%H %%I
  21. )
  22. echo This test was completed using %COMPUTERNAME% on %is:% at %time% >> logs\%COMPUTERNAME%\%fname%
  23. echo. >> logs\%COMPUTERNAME%\%fname%
  24. echo. >> logs\%COMPUTERNAME%\%fname%
  25. cls
  26. for /f "tokens=1,3" %%G in ('"%~dp0resources\smartctl.exe" --scan') do (
  27.     call set curdisk=disk!id!
  28.     call set !curdisk!=%%G
  29.     call set !curdisk!_type=%%H
  30.    
  31. set /a id+=1
  32. )
  33. set numdisks=%id%
  34. ::skip the first disk as it is the OS raid
  35. set pc=MINWINPC
  36. if not "%COMPUTERNAME%"=="%pc%" (set id=1)
  37. ) else (
  38.     set id=0
  39. )
  40. set id=1
  41. call set curdisk=disk!id!
  42. :preread
  43. if %id% GEQ %numdisks% goto finish else (
  44.     call set curdisk=disk!id!
  45.     set /a id+=1
  46.     set !curdisk!_result=PASSED
  47.     if "!%curdisk%_type!"=="scsi" ( call set !curdisk!_type=sat )
  48.     goto :smartreader
  49. )
  50.  
  51. :smartreader
  52. call set !curdisk!_ec=0
  53. call set !curdisk!_wc=0
  54. ::for compatibility with wd drives
  55. set Command_Timeout=0
  56. Setlocal EnableDelayedExpansion
  57. set filter=  =
  58. echo Currently testing: !%curdisk%!
  59. for /f "tokens=2,3* delims= = " %%I in ('"%~dp0resources\smartctl.exe" -a !%curdisk%! -d !%curdisk%_type!') do set %%I=%%J %%K
  60. if "%Family:%"=="" set Family:=Western Digital
  61. echo ******************Reading S.M.A.R.T for disk:****************** >> logs\%COMPUTERNAME%\%fname%
  62. call echo ****%Family:% (%Model:%, S/N %Number:%)**** >> logs\%COMPUTERNAME%\%fname%
  63. echo *************************************************************** >> logs\%COMPUTERNAME%\%fname%
  64. echo. >> logs\%COMPUTERNAME%\%fname%
  65. set Family:=Western Digital
  66. for /f "tokens=2,10 skip=50 delims= = " %%I in ('"%~dp0resources\smartctl.exe" -a !%curdisk%! -d !%curdisk%_type!') do set %%I=%%J
  67.  
  68. if /I %Reallocated_Sector_Ct% GEQ 20 (
  69.     call set !curdisk!_result=FAILED
  70.     call set /a !curdisk!_ec+=1
  71.     echo Failed: Reallocated_Sector_Ct ( Value: %Reallocated_Sector_Ct%, Threshold: 20^) >> logs\%COMPUTERNAME%\%fname%
  72.     echo. >> logs\%COMPUTERNAME%\%fname%
  73. ) else (
  74.     echo Passed: Reallocated_Sector_Ct ( Value: %Reallocated_Sector_Ct%, Threshold: 20^) >> logs\%COMPUTERNAME%\%fname%
  75.     echo. >> logs\%COMPUTERNAME%\%fname%
  76. )
  77. if /I %Current_Pending_Sector% GEQ 10 (
  78.     call set !curdisk!_result=FAILED
  79.     call set /a !curdisk!_ec+=1
  80.     echo Failed: Current_Pending_Sector ( Value: %Current_Pending_Sector%, Threshold: 10^) >> logs\%COMPUTERNAME%\%fname%
  81.     echo. >> logs\%COMPUTERNAME%\%fname%
  82. ) else (
  83.     echo Passed: Current_Pending_Sector ( Value: %Current_Pending_Sector%, Threshold: 10^) >> logs\%COMPUTERNAME%\%fname%
  84.     echo. >> logs\%COMPUTERNAME%\%fname%
  85. )
  86. if /I %Offline_Uncorrectable% GEQ 10 (
  87.     call set !curdisk!_result=FAILED
  88.     call set /a !curdisk!_ec+=1
  89.     echo Failed: Offline_Uncorrectable ( Value: %Offline_Uncorrectable%, Threshold: 10^) >> logs\%COMPUTERNAME%\%fname%
  90.     echo. >> logs\%COMPUTERNAME%\%fname%
  91. ) else (
  92.     echo Passed: Offline_Uncorrectable ( Value: %Offline_Uncorrectable%, Threshold: 10^) >> logs\%COMPUTERNAME%\%fname%
  93.     echo. >> logs\%COMPUTERNAME%\%fname%
  94. )
  95. if /I %Power_on_Hours% GEQ 13392 (
  96.     if not ("!%curdisk%_result!"=="FAILED" (
  97.         call set !curdisk!_result=WARNING
  98.     )
  99.     call set /a !curdisk!_wc+=1
  100.     echo Warning: Power_on_Hours ( Value: %Power_on_Hours%, Threshold: 13392^) >> logs\%COMPUTERNAME%\%fname%
  101.     echo Note: This is not an indicator of a bad disk, but simply and old disk >> logs\%COMPUTERNAME%\%fname%
  102.     echo. >> logs\%COMPUTERNAME%\%fname%
  103. )  else (
  104.     echo Passed: Power_on_Hours ( Value: %Power_on_Hours%, Threshold: 13392^) >> logs\%COMPUTERNAME%\%fname%
  105.     echo. >> logs\%COMPUTERNAME%\%fname%
  106. )
  107. if /I %UDMA_CRC_Error_Count% GEQ 15 (
  108.     call set /a !curdisk!_wc+=1
  109.     if not ("!%curdisk%_result!"=="FAILED" (
  110.         call set !curdisk!_result=WARNING
  111.     )
  112.     echo Warning: UDMA_CRC_Error_Count ( Value: %UDMA_CRC_Error_Count%, Threshold: 15^) >> logs\%COMPUTERNAME%\%fname%
  113.     echo Note: This can be an Indicator of a bad cable or controller >> logs\%COMPUTERNAME%\%fname%
  114.     echo. >> logs\%COMPUTERNAME%\%fname%
  115. )
  116. if /I %Command_Timeout% GEQ 1000 (
  117.     call set /a !curdisk!_wc+=1
  118.     if not ("!%curdisk%_result!"=="FAILED" (
  119.         call set !curdisk!_result=WARNING
  120.     )
  121.     echo Warning: Command_Timeout ( Value: %Command_Timeout%, Threshold: 1000^) >> logs\%COMPUTERNAME%\%fname%
  122.     echo Note: This can be an Indicator of a bad cable or controller >> logs\%COMPUTERNAME%\%fname%
  123.     echo. >> logs\%COMPUTERNAME%\%fname%
  124. )
  125. set poh=%Power_on_Hours%
  126. for /f "tokens=2,4,5,6 delims=  = " %%I in ('"%~dp0resources\smartctl.exe" -a !%curdisk%! -d !%curdisk%_type!') do set %%I_value=%%J & set %%I_worst=%%K & set %%I_thresh=%%L
  127. ::this one is different
  128. ::scrubbing the values
  129. set val=%Raw_Read_Error_Rate_value:~0,1%
  130. if "%val%"=="0" (
  131.     set Raw_Read_Error_Rate_value=%Raw_Read_Error_Rate_value:~1%
  132. )
  133. set val=%Raw_Read_Error_Rate_value:~0,1%
  134. if "%val%"=="0" (
  135.     set Raw_Read_Error_Rate_value=%Raw_Read_Error_Rate_value:~1%
  136. )
  137. set val=%Raw_Read_Error_Rate_worst:~0,1%
  138. if "%val%"=="0" (
  139.     set Raw_Read_Error_Rate_worst=%Raw_Read_Error_Rate_worst:~1%
  140. )
  141. set val=%Raw_Read_Error_Rate_worst:~0,1%
  142. if "%val%"=="0" (
  143.     set Raw_Read_Error_Rate_worst=%Raw_Read_Error_Rate_worst:~1%
  144. )
  145. echo Note: The meaning of Raw_Read_Error_Rate varies from manufacturer to >> logs\%COMPUTERNAME%\%fname%
  146. echo       manufacturer, so this should not be the sole indicator for a drive >> logs\%COMPUTERNAME%\%fname%
  147. echo. >> logs\%COMPUTERNAME%\%fname%
  148. if /I %Raw_Read_Error_Rate_value% LEQ 59 (
  149.     call set !curdisk!_result=FAILED
  150.     echo Failed: Raw_Read_Error_Rate_value ( Value: %Raw_Read_Error_Rate_value%, Threshold: 59^) >> logs\%COMPUTERNAME%\%fname%
  151.     echo. >> logs\%COMPUTERNAME%\%fname%
  152.  
  153. ) else (
  154.     echo Passed: Raw_Read_Error_Rate_value ( Value: %Raw_Read_Error_Rate_value%, Threshold: 59^) >> logs\%COMPUTERNAME%\%fname%
  155.     echo. >> logs\%COMPUTERNAME%\%fname%
  156. )
  157. if /I %Raw_Read_Error_Rate_worst% LEQ 59 (
  158.     call set !curdisk!_result=FAILED
  159.     echo Failed: Raw_Read_Error_Rate_worst ( Value: %Raw_Read_Error_Rate_worst%, Threshold: 59^) >> logs\%COMPUTERNAME%\%fname%
  160.     echo. >> logs\%COMPUTERNAME%\%fname%
  161.  
  162. ) else (
  163.     echo Passed: Raw_Read_Error_Rate_worst ( Value: %Raw_Read_Error_Rate_worst%, Threshold: 59^) >> logs\%COMPUTERNAME%\%fname%
  164.     echo. >> logs\%COMPUTERNAME%\%fname%
  165. )
  166. ::doing time calcs
  167. set /a age="%Power_on_Hours%/24"
  168. set hours=%Power_on_Hours%
  169. set /a hours-=%age%*24
  170. set /a days="%Power_on_Hours%-%hours%"
  171. set /a days="%days%/24"
  172. set /a age="%days%/365"
  173. set /a days-=%age%*365
  174. if %days% EQU 0 (
  175.     echo This disk has been online for %Power_on_Hours% hours >> logs\%COMPUTERNAME%\%fname%
  176.     echo. >> logs\%COMPUTERNAME%\%fname%
  177. ) else (
  178.     if %age%==0 (
  179.         echo This disk has been online for %days% days, %hours% hours >> logs\%COMPUTERNAME%\%fname%
  180.         echo. >> logs\%COMPUTERNAME%\%fname%
  181.     ) else (
  182.         echo This disk has been online for %age% years, %days% days, %hours% hours >> logs\%COMPUTERNAME%\%fname%
  183.         echo. >> logs\%COMPUTERNAME%\%fname%
  184.     )
  185. )
  186. if !%curdisk%_ec! GEQ 1 (
  187.     echo This disk should be returned to the manufacturer >> logs\%COMPUTERNAME%\%fname%
  188.     echo. >> logs\%COMPUTERNAME%\%fname%
  189. ) else (
  190.     if !%curdisk%_wc! GEQ 1 (
  191.         echo This disk can be used internally for non-critical roles >> logs\%COMPUTERNAME%\%fname%
  192.         echo. >> logs\%COMPUTERNAME%\%fname%
  193.     ) else (
  194.         if %age% LSS 1 (
  195.         echo This disk can be returned to stock >> logs\%COMPUTERNAME%\%fname%
  196.         echo. >> logs\%COMPUTERNAME%\%fname%
  197.         ) else (
  198.             echo This disk can be used internally for non-critical roles >> logs\%COMPUTERNAME%\%fname%
  199.             echo. >> logs\%COMPUTERNAME%\%fname%
  200.         )
  201.     )
  202. )
  203. cls
  204. goto preread
  205. :finish
  206. set id=0
  207. for /f %%G in ('"%~dp0resources\smartctl.exe" --scan') do (
  208.     call set curdisk=disk!id!
  209.     call set !curdisk!_mp=%%G  
  210.     set /a id+=1
  211. )
  212. set id=0
  213. :fin
  214. ::result handling
  215. if %id% GEQ %numdisks% goto end else (
  216.     echo.
  217.     echo **********SUMMARY**********
  218.     call set curdisk=disk!id!
  219.     set /a id+=1
  220.     for /f "tokens=1,2 delims=:=" %%I in ('"%~dp0resources\smartctl.exe" -a !%curdisk%_mp! -d !%curdisk%_type!') do set %%I=%%J
  221.     echo !curdisk! (!%curdisk%_mp!):
  222.     echo Model: %Model Family%
  223.     echo Model Number: %Device Model%
  224.     echo Serial number: %Serial Number%
  225.     echo Capacity: %User Capacity% 
  226.     echo.
  227.     if !%curdisk%_ec! GEQ 1 (
  228.         set !curdisk!_result=FAILED
  229.     ) else (
  230.         if !%curdisk%_wc! GEQ 1 (
  231.             set !curdisk!_result=WARNING
  232.         ) else (
  233.             set !curdisk!_result=PASSED
  234.         )
  235.     )
  236.     echo Result: !%curdisk%_result!
  237.     echo.
  238.     echo Error Count: !%curdisk%_ec!
  239.     echo Warning Count: !%curdisk%_wc! 
  240.     set Model Family=Western Digital
  241.     goto fin
  242. )
  243. :end
  244. echo.
  245. echo The Log can be found at:
  246. echo %~dp0logs\%COMPUTERNAME%\%fname%
  247. echo.
  248. set /p asdf="Press Enter to quit"
  249. if %asdf% EQU "s" (
  250.     \notepad\nopad.exe %~dp0logs\%COMPUTERNAME%\%fname%
  251. )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement