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

时间:2013-07-16 15:50:19

标签: powershell memory byte wmi

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

我一直在使用以下PS cmdlet来获取物理内存大小,但每次新轮询时值都会更改。

(get-counter -counter "\Memory\Available Bytes").CounterSamples[0].CookedValue + 
(get-counter -counter "\Memory\Committed Bytes").CounterSamples[0].CookedValue

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

我也在测试从使用

返回的值添加这些计数器所获得的值
(get-wmiobject -class "win32_physicalmemory" -namespace "root\CIMV2").Capacity

这给了我值:8589934592 bytes

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

9 个答案:

答案 0 :(得分:19)

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

(systeminfo | Select-String 'Total Physical Memory:').ToString().Split(':')[1].Trim()

答案 1 :(得分:10)

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

我想避免使用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}

答案 2 :(得分:7)

我想说,与使用systeminfo不同,这样可以帮助获得GB机器中的总物理内存

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

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

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

答案 3 :(得分:2)

这将为您提供另一个WMI类的总金额:

gtin

希望这会有所帮助。

答案 4 :(得分:0)

对于那些从晚些时候来到这里的人和一个有效的解决方案:

(Get-WmiObject -class "cim_physicalmemory" | Measure-Object -Property Capacity -Sum).Sum

这将给出总字节数。

$bytes = (Get-WmiObject -class "cim_physicalmemory" | Measure-Object -Property Capacity -Sum).Sum

$kb = $bytes / 1024
$mb = $bytes / 1024 / 1024
$gb = $bytes / 1024 / 1024 / 1024

我测试了这个到Windows Server 2008(winver 6.0),即使这个命令似乎有效

答案 5 :(得分:0)

也许不是最好的解决方案,但它对我有用。

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")
$VBObject=[Microsoft.VisualBasic.Devices.ComputerInfo]::new()
$SystemMemory=$VBObject.TotalPhysicalMemory

答案 6 :(得分:0)

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

(Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb

答案 7 :(得分:0)

以下给出了总的物理内存。

gwmi Win32_OperatingSystem | Measure-Object -Property TotalVisibleMemorySize -Sum | % {[Math]::Round($_.sum/1024/1024)}

答案 8 :(得分:0)

使用 Get-CimInstance 可以为您提供每个 RAM 棒的单独大小,您必须手动将这些大小相加。因此,如果可能,我更喜欢 Get-WMIObject

(Get-WMIObject Win32_OperatingSystem).TotalVisibleMemorySize  # in KB

38326300
(Get-WMIObject Win32_OperatingSystem).TotalVisibleMemorySize / 1MB  # in GB

31.8008079528809