【问题标题】:WMIC Command not displaying correct value?WMIC 命令未显示正确的值?
【发布时间】:2018-12-19 09:20:17
【问题描述】:

我们使用一种产品向我们的平台报告 RAM 和 CPU 等审计信息。

但是,在 RAM 方面,我们得到了不同寻常的结果。

产品使用命令:wmic computersystem get totalphysicalmemory

输出值为2.3GB RAM

但是它安装了 4GB。我们使用这些信息为我们的客户创建路线图,因此需要准确。知道为什么吗?

【问题讨论】:

  • 我不知道您为什么使用这些信息为您的客户创建路线图!此外,如果您未将代码包含在您的问题中,我们将无法为您提供帮助;请相应地edit it
  • WMI 结果以字节为单位返回,例如4294967296。您确定它有 2.3GB 的输出,还是您尝试执行某种未按预期工作的数学运算?

标签: batch-file ram audit wmic


【解决方案1】:
wmic memorychip get capacity

来源:How can I get total physical memory using Windows cmd

使用混合 [batch-Vbscript] 文件,您可以执行以下操作:

@echo off
Mode 55,10 & color 0A
Title TotalPhysicalMemory ^& Memorychip Capacity
Set "WMIC_TOTMEM=wmic ComputerSystem get TotalPhysicalMemory /format:Value"
Set "WMIC_Capacity=wmic memorychip get capacity /format:Value"
Set "CAP=Capacity"
Set "TOT=TotalPhysicalMemory"
Call :GetTOTMEM %TOT% TotalPhysicalMemory
Call :GetCapacityMem %CAP% Capacity
echo(
Call :Convert %TotalPhysicalMemory% TotalPhysicalMemory_Converted
Call :Convert %Capacity% Capacity_Converted
echo   -------------------------------------------------
echo     TotalPhysicalMemory = %TotalPhysicalMemory%
echo     Memorychip Capacity = %Capacity%
echo   -------------------Converted---------------------
echo     TotalPhysicalMemory = %TotalPhysicalMemory_Converted%
echo     Memorychip Capacity = %Capacity_Converted% 
echo   -------------------------------------------------
pause>nul & Exit
::-------------------------------------------------------
:GetCapacityMem
FOR /F "tokens=2 delims==" %%I IN (
  '%WMIC_Capacity% ^| find /I "%~1" 2^>^nul'
) DO FOR /F "delims=" %%A IN ("%%I") DO SET "%2=%%A"
Exit /b
::-------------------------------------------------------
:GetTOTMEM
FOR /F "tokens=2 delims==" %%I IN (
  '%WMIC_TOTMEM% ^| find /I "%~1" 2^>^nul'
) DO FOR /F "delims=" %%A IN ("%%I") DO SET "%2=%%A"
Exit /b
::-------------------------------------------------------
:Convert
Set "VBS=%Temp%\%Random%.vbs"
(
    echo wscript.echo Convert("%~1"^)
    echo 'Function to format a number into typical size scales
    echo Function Convert(iSize^)
    echo    aLabel = Array("bytes", "KB", "MB", "GB", "TB"^)
    echo    For i = 0 to 4
    echo        If iSize ^> 1024 Then
    echo            iSize = iSize / 1024
    echo        Else
    echo            Exit For
    echo        End If
    echo    Next
    echo    Convert = Round(iSize,2^) ^& " " ^& aLabel(i^)
    echo End Function
)>"%VBS%"
for /f "delims=" %%a in ('Cscript //NoLogo "%VBS%"') do ( set "%2=%%a" )
Del "%VBS%"
Exit /b
::-------------------------------------------------------

【讨论】:

  • @JamieEdwards 如果这对您有帮助,请不要忘记接受它作为答案!
  • 这会返回每个内存芯片的值,因此您必须自己将它们相加(由于 32 位限制,这在 cmd 中并不容易)...
【解决方案2】:

我不知道wmic ComputerSystem get TotalPhysicalMemory 返回的数字实际上代表什么,但我认识到结果数字比wmic MemoryChip get Capacity 给出的数字的总和要少一些,后者返回每个已安装内存设备的大小。

这是一个确定总内存容量的纯批处理脚本(参见解释性 cmets),解决了 32 位有符号整数的数值限制:

@echo off
setlocal EnableExtensions EnableDelayedExpansion

rem /* Retrieve total physical memory: */
for /F "skip=1 delims=" %%I in ('wmic ComputerSystem get TotalPhysicalMemory') do for /F %%J in ("%%I") do set "TOTMEM=%%J"
echo total physical memory = %TOTMEM%

rem /* Retrieve total memory capacity: */
set "GBYTESUM=" & set "BYTESUM="
for /F "skip=1 delims=" %%I in ('wmic MemoryChip get Capacity') do for /F %%J in ("%%I") do (
    rem // Split huge number into two parts, Gigabyte and remaining Byte values:
    set "SIZE=%%J" & set "GBYTES=!SIZE:~,-9!" & set "SIZE=000000000%%J" & set "BYTES=!SIZE:~-9!"
    rem // Sum up Byte values, compensate for trailing zeros:
    set /A "BYTESUM+=1!BYTES!-1000000000"
    rem // Determine carry to be added to GigaByte values:
    set "CARRY=!BYTESUM:~,-9!" & set "CARRY+=0" & set "BYTESUM=!BYTESUM:~-9!"
    rem // Sum up Gigabyte values plus carry:
    set /A "GBYTESUM+=GBYTES+CARRY"
)
rem // Rejoin Gigabyte and Byte values into a huge number:
set "BYTESUM=000000000%BYTESUM%"
for /F "tokens=* delims=0 eol=0" %%Z in ("%GBYTESUM%%BYTESUM:~-9%") do set "TOTCAP=%%Z"
if not defined TOTCAP set "TOTCAP=0"
echo total memory capacity = %TOTCAP%

endlocal
exit /B

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-02-09
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多