如何在没有WMI的情况下使用PowerShell获取总物理内存大小?

elt*_*431 13 memory powershell wmi byte

我正在尝试使用PowerShell获取物理内存大小,但不使用get-wmiobject.

我一直在使用以下PS cmdlet来获取物理内存大小,但值随每次新轮询而变化.

(get-counter -counter "\Memory\Available Bytes").CounterSamples[0].CookedValue + 
(get-counter -counter "\Memory\Committed Bytes").CounterSamples[0].CookedValue
Run Code Online (Sandbox Code Playgroud)

一般来说,这给了我一个值:8605425664字节

我也在测试从添加这些计数器得到的值和返回值

(get-wmiobject -class "win32_physicalmemory" -namespace "root\CIMV2").Capacity
Run Code Online (Sandbox Code Playgroud)

这给了我值:8589934592字节

因此,不仅从计数器计算的总物理内存发生变化,而且它的值与WMI值相差几兆字节.任何人都有任何想法如何在不使用WMI的情况下获得物理内存大小?

rav*_*nth 22

如果您不想使用WMI,我可以建议使用systeminfo.exe.但是,可能有更好的方法来做到这一点.

(systeminfo | Select-String 'Total Physical Memory:').ToString().Split(':')[1].Trim()
Run Code Online (Sandbox Code Playgroud)


Zac*_*k A 15

让我们不要把事情复杂化...:

(Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb
Run Code Online (Sandbox Code Playgroud)

  • KISS 校长是最好的! (2认同)

elt*_*431 11

我想为将来参考的人做一个记录.

我想避免使用WMI,因为它使用DCOM协议,要求远程计算机具有必要的权限,只能在该远程计算机上手动设置.

所以,我想避免使用WMI,但经常使用get-counter没有我想要的性能计数器.

我使用的解决方案是公共信息模型(CIM).与WMI不同,CIM默认不使用DCOM.CIM cmdlet不返回WMI对象,而是返回PowerShell对象.

CIM默认使用Ws-MAN协议,但它仅适用于可以访问Ws-Man 3.0或更高版本的计算机.因此,早期版本的PowerShell将无法发布CIM cmdlet.

我最终用来获取总物理内存大小的cmdlet是:

get-ciminstance -class "cim_physicalmemory" | % {$_.Capacity}
Run Code Online (Sandbox Code Playgroud)

  • 如果计算机上安装了多个RAM库,则您的命令将返回一个列表。以下将显示总计:`(Get-CimInstance -ClassName'Cim_PhysicalMemory'|测量对象-属性容量-Sum).Sum` (3认同)

小智 7

我还想说,而不是与系统的系统信息会,这将有助于在得到总的物理内存GB的机器

Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum | Foreach {"{0:N2}" -f ([math]::round(($_.Sum / 1GB),2))}
Run Code Online (Sandbox Code Playgroud)

您可以将此值传递给变量,并获取机器中总物理内存的总输出

   $totalmemory = Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum | Foreach {"{0:N2}" -f ([math]::round(($_.Sum / 1GB),2))}
   $totalmemory
Run Code Online (Sandbox Code Playgroud)