Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- @echo off
- set id=0
- Setlocal EnableDelayedExpansion
- cls
- echo This script can only check up to 9 disks at once
- set /p in=Press enter to Continue
- if not exist logs mkdir logs
- if not exist logs\%COMPUTERNAME% mkdir logs\%COMPUTERNAME%
- for /f "tokens=5,6,7,8 delims=:. " %%G in ('echo.^|time') do (
- set time=%%G%%H%%I%%J
- )
- for /f "tokens=2,3,4 delims=/ " %%G in ('date /t') do (
- set date=%%G%%H%%I
- )
- set fname=smartcheck-%date%%time%.log
- for /f "tokens=5" %%G in ('echo.^|time') do (
- set time=%%G
- )
- for /f "tokens=4,5,6" %%G in ('echo.^|date') do (
- set %%G=%%H %%I
- )
- echo This test was completed using %COMPUTERNAME% on %is:% at %time% >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- cls
- for /f "tokens=1,3" %%G in ('"%~dp0resources\smartctl.exe" --scan') do (
- call set curdisk=disk!id!
- call set !curdisk!=%%G
- call set !curdisk!_type=%%H
- set /a id+=1
- )
- set numdisks=%id%
- ::skip the first disk as it is the OS raid
- set pc=MINWINPC
- if not "%COMPUTERNAME%"=="%pc%" (set id=1)
- ) else (
- set id=0
- )
- set id=1
- call set curdisk=disk!id!
- :preread
- if %id% GEQ %numdisks% goto finish else (
- call set curdisk=disk!id!
- set /a id+=1
- set !curdisk!_result=PASSED
- if "!%curdisk%_type!"=="scsi" ( call set !curdisk!_type=sat )
- goto :smartreader
- )
- :smartreader
- call set !curdisk!_ec=0
- call set !curdisk!_wc=0
- ::for compatibility with wd drives
- set Command_Timeout=0
- Setlocal EnableDelayedExpansion
- set filter= =
- echo Currently testing: !%curdisk%!
- for /f "tokens=2,3* delims= = " %%I in ('"%~dp0resources\smartctl.exe" -a !%curdisk%! -d !%curdisk%_type!') do set %%I=%%J %%K
- if "%Family:%"=="" set Family:=Western Digital
- echo ******************Reading S.M.A.R.T for disk:****************** >> logs\%COMPUTERNAME%\%fname%
- call echo ****%Family:% (%Model:%, S/N %Number:%)**** >> logs\%COMPUTERNAME%\%fname%
- echo *************************************************************** >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- set Family:=Western Digital
- for /f "tokens=2,10 skip=50 delims= = " %%I in ('"%~dp0resources\smartctl.exe" -a !%curdisk%! -d !%curdisk%_type!') do set %%I=%%J
- if /I %Reallocated_Sector_Ct% GEQ 20 (
- call set !curdisk!_result=FAILED
- call set /a !curdisk!_ec+=1
- echo Failed: Reallocated_Sector_Ct ( Value: %Reallocated_Sector_Ct%, Threshold: 20^) >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- ) else (
- echo Passed: Reallocated_Sector_Ct ( Value: %Reallocated_Sector_Ct%, Threshold: 20^) >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- )
- if /I %Current_Pending_Sector% GEQ 10 (
- call set !curdisk!_result=FAILED
- call set /a !curdisk!_ec+=1
- echo Failed: Current_Pending_Sector ( Value: %Current_Pending_Sector%, Threshold: 10^) >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- ) else (
- echo Passed: Current_Pending_Sector ( Value: %Current_Pending_Sector%, Threshold: 10^) >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- )
- if /I %Offline_Uncorrectable% GEQ 10 (
- call set !curdisk!_result=FAILED
- call set /a !curdisk!_ec+=1
- echo Failed: Offline_Uncorrectable ( Value: %Offline_Uncorrectable%, Threshold: 10^) >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- ) else (
- echo Passed: Offline_Uncorrectable ( Value: %Offline_Uncorrectable%, Threshold: 10^) >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- )
- if /I %Power_on_Hours% GEQ 13392 (
- if not ("!%curdisk%_result!"=="FAILED" (
- call set !curdisk!_result=WARNING
- )
- call set /a !curdisk!_wc+=1
- echo Warning: Power_on_Hours ( Value: %Power_on_Hours%, Threshold: 13392^) >> logs\%COMPUTERNAME%\%fname%
- echo Note: This is not an indicator of a bad disk, but simply and old disk >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- ) else (
- echo Passed: Power_on_Hours ( Value: %Power_on_Hours%, Threshold: 13392^) >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- )
- if /I %UDMA_CRC_Error_Count% GEQ 15 (
- call set /a !curdisk!_wc+=1
- if not ("!%curdisk%_result!"=="FAILED" (
- call set !curdisk!_result=WARNING
- )
- echo Warning: UDMA_CRC_Error_Count ( Value: %UDMA_CRC_Error_Count%, Threshold: 15^) >> logs\%COMPUTERNAME%\%fname%
- echo Note: This can be an Indicator of a bad cable or controller >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- )
- if /I %Command_Timeout% GEQ 1000 (
- call set /a !curdisk!_wc+=1
- if not ("!%curdisk%_result!"=="FAILED" (
- call set !curdisk!_result=WARNING
- )
- echo Warning: Command_Timeout ( Value: %Command_Timeout%, Threshold: 1000^) >> logs\%COMPUTERNAME%\%fname%
- echo Note: This can be an Indicator of a bad cable or controller >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- )
- set poh=%Power_on_Hours%
- 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
- ::this one is different
- ::scrubbing the values
- set val=%Raw_Read_Error_Rate_value:~0,1%
- if "%val%"=="0" (
- set Raw_Read_Error_Rate_value=%Raw_Read_Error_Rate_value:~1%
- )
- set val=%Raw_Read_Error_Rate_value:~0,1%
- if "%val%"=="0" (
- set Raw_Read_Error_Rate_value=%Raw_Read_Error_Rate_value:~1%
- )
- set val=%Raw_Read_Error_Rate_worst:~0,1%
- if "%val%"=="0" (
- set Raw_Read_Error_Rate_worst=%Raw_Read_Error_Rate_worst:~1%
- )
- set val=%Raw_Read_Error_Rate_worst:~0,1%
- if "%val%"=="0" (
- set Raw_Read_Error_Rate_worst=%Raw_Read_Error_Rate_worst:~1%
- )
- echo Note: The meaning of Raw_Read_Error_Rate varies from manufacturer to >> logs\%COMPUTERNAME%\%fname%
- echo manufacturer, so this should not be the sole indicator for a drive >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- if /I %Raw_Read_Error_Rate_value% LEQ 59 (
- call set !curdisk!_result=FAILED
- echo Failed: Raw_Read_Error_Rate_value ( Value: %Raw_Read_Error_Rate_value%, Threshold: 59^) >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- ) else (
- echo Passed: Raw_Read_Error_Rate_value ( Value: %Raw_Read_Error_Rate_value%, Threshold: 59^) >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- )
- if /I %Raw_Read_Error_Rate_worst% LEQ 59 (
- call set !curdisk!_result=FAILED
- echo Failed: Raw_Read_Error_Rate_worst ( Value: %Raw_Read_Error_Rate_worst%, Threshold: 59^) >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- ) else (
- echo Passed: Raw_Read_Error_Rate_worst ( Value: %Raw_Read_Error_Rate_worst%, Threshold: 59^) >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- )
- ::doing time calcs
- set /a age="%Power_on_Hours%/24"
- set hours=%Power_on_Hours%
- set /a hours-=%age%*24
- set /a days="%Power_on_Hours%-%hours%"
- set /a days="%days%/24"
- set /a age="%days%/365"
- set /a days-=%age%*365
- if %days% EQU 0 (
- echo This disk has been online for %Power_on_Hours% hours >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- ) else (
- if %age%==0 (
- echo This disk has been online for %days% days, %hours% hours >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- ) else (
- echo This disk has been online for %age% years, %days% days, %hours% hours >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- )
- )
- if !%curdisk%_ec! GEQ 1 (
- echo This disk should be returned to the manufacturer >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- ) else (
- if !%curdisk%_wc! GEQ 1 (
- echo This disk can be used internally for non-critical roles >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- ) else (
- if %age% LSS 1 (
- echo This disk can be returned to stock >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- ) else (
- echo This disk can be used internally for non-critical roles >> logs\%COMPUTERNAME%\%fname%
- echo. >> logs\%COMPUTERNAME%\%fname%
- )
- )
- )
- cls
- goto preread
- :finish
- set id=0
- for /f %%G in ('"%~dp0resources\smartctl.exe" --scan') do (
- call set curdisk=disk!id!
- call set !curdisk!_mp=%%G
- set /a id+=1
- )
- set id=0
- :fin
- ::result handling
- if %id% GEQ %numdisks% goto end else (
- echo.
- echo **********SUMMARY**********
- call set curdisk=disk!id!
- set /a id+=1
- for /f "tokens=1,2 delims=:=" %%I in ('"%~dp0resources\smartctl.exe" -a !%curdisk%_mp! -d !%curdisk%_type!') do set %%I=%%J
- echo !curdisk! (!%curdisk%_mp!):
- echo Model: %Model Family%
- echo Model Number: %Device Model%
- echo Serial number: %Serial Number%
- echo Capacity: %User Capacity%
- echo.
- if !%curdisk%_ec! GEQ 1 (
- set !curdisk!_result=FAILED
- ) else (
- if !%curdisk%_wc! GEQ 1 (
- set !curdisk!_result=WARNING
- ) else (
- set !curdisk!_result=PASSED
- )
- )
- echo Result: !%curdisk%_result!
- echo.
- echo Error Count: !%curdisk%_ec!
- echo Warning Count: !%curdisk%_wc!
- set Model Family=Western Digital
- goto fin
- )
- :end
- echo.
- echo The Log can be found at:
- echo %~dp0logs\%COMPUTERNAME%\%fname%
- echo.
- set /p asdf="Press Enter to quit"
- if %asdf% EQU "s" (
- \notepad\nopad.exe %~dp0logs\%COMPUTERNAME%\%fname%
- )
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement