@REM - GetWMICInfo.BAT (26 Jun 2024 // 30 Jun 2024 / 26 Jun 2024): Obtain and Format WMIC Info
@ECHO OFF
::: This script will obtain some WMIC info, and format the storage sizes
::: to KB, MB, GB or TB as preferred. For convenience, two subroutines are
::: provided. One of the subroutines uses all native code, and the other
::: relies on a 3rd party utility: CCALC.EXE
::: (https://www.majorgeeks.com/files/details/brainwave_ccalc.html)
:::
::: I was going to provide only the native option, but file sizes are
::: regularly large enough to generate errors, so I provided both routines.
:::
::: If you want the debug code to run, run the batch file with any parameter.
::: i.e. GetWMICInfo.BAT #
:::
::: The full script can be found here ..... https://pastebin.com/L0PjaNK4
:::
:Variables
SETLOCAL ENABLEDELAYEDEXPANSION
SET #DEBUG=%~1
SET #ITERATIONS=19
rem -- Parse WMIC and format returned drive info
:ParseWMIC
FOR /F "SKIP=2 TOKENS=1-7 DELIMS=," %%a IN ('WMIC PARTITION GET Diskindex^,Name^,Index^,Description^,Size /FORMAT:CSV') DO (
CALL :ConvertNumber_Old "%%~g" MB #SIZE_OLD
CALL :ConvertNumber "%%~g" MB #SIZE_MB
CALL :ConvertNumber "%%~g" GB #SIZE_GB
ECHO DiskIndex : %%c
ECHO PartitionIndex : %%d
ECHO Partition Info : %%e,%%f
ECHO Partition Type : %%b
ECHO Raw Size : %%g
ECHO Size : !#SIZE_OLD!
ECHO Size : !#SIZE_MB!
ECHO Size : !#SIZE_GB!
ECHO:
)
rem -- Test My Calculation Routines (set #DEBUG=TRUE if you want this to run)
:RANDOM_MATH_TEST
IF DEFINED #DEBUG (
ECHO:
ECHO *** RANDOM NUMBER TESTING ***
ECHO:
FOR /L %%z IN (1,1,%#ITERATIONS%) DO (
SET /A #VAL=!RANDOM! * !RANDOM! * 5
CALL :ConvertNumber_Old "!#VAL!" MB #SIZE_OLD
CALL :ConvertNumber "!#VAL!" MB #SIZE_MB
CALL :ConvertNumber "!#VAL!" GB #SIZE_GB
ECHO Displaying !#VAL! in MB ^& GB
ECHO - Using Native Calculation .... !#SIZE_OLD!
ECHO - Using CCALC [MB] ............ !#SIZE_MB!
ECHO - Using CCALC [GB] ............ !#SIZE_GB!
ECHO:
)
)
:ExitBatch
TIMEOUT 60
ENDLOCAL
GOTO :EOF
rem -- SUBROUTINE: Convert Large Number to KB, MB, GB, TB or PB (using CCALC.EXE)
:ConvertNumber
rem %1 = Current Number to be Converted/Formatted
rem %2 = Unit of Measurement to be Used
rem %3 = New Variable To Store Converted/Formatted Number
IF "%~3"=="" GOTO :EOF
SET #OPERAND=+ 0
IF /I "%~2"=="KB" SET #OPERAND=/ 1024
IF /I "%~2"=="MB" SET #OPERAND=/ 1024 / 1024
IF /I "%~2"=="GB" SET #OPERAND=/ 1024 / 1024 / 1024
IF /I "%~2"=="TB" SET #OPERAND=/ 1024 / 1024 / 1024 / 1024
SET #NUM=%~1
SET #NUM=!#NUM:-=!
FOR /F %%N IN ('CCALC !#NUM! %#OPERAND% -f "#,##0.000" 2^>NUL') DO SET %~3=%%~N %~2
GOTO :EOF
rem -- SUBROUTINE: Convert Large Number to KB, MB, GB, TB or PB
:ConvertNumber_Old
rem %1 = Current Number to be Converted
rem %2 = Unit of Measurement to be Used
rem %3 = New Variable To Store Converted Number
IF "%~3"=="" GOTO :EOF
SET #OPERAND=+ 0
IF /I "%~2"=="KB" SET #OPERAND=/ 1024
IF /I "%~2"=="MB" SET #OPERAND=/ 1024 / 1024
IF /I "%~2"=="GB" SET #OPERAND=/ 1024 / 1024 / 1024
IF /I "%~2"=="TB" SET #OPERAND=/ 1024 / 1024 / 1024 / 1024
SET #NUM=%~1
SET #NUM=!#NUM:-=!
SET %~3=Could Not Calculate
SET /A %~3=!#NUM! %#OPERAND% 2>NUL
SET %~3=!%~3! %~2
GOTO :EOF