如何在PowerShell中获取总物理内存大小,而不使用WMI?

25

我正在尝试使用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字节

因此,不仅计数器计算出的总物理内存在变化,而且它的值与WMI值相差几百万字节。有人知道如何在不使用WMI的情况下获取物理内存大小吗?


2
只是出于好奇,你为什么想避免使用WMI? - Keith Hill
4
我避免使用WMI,因为它需要DCOM权限,所以没有权限的用户将无法获取这些信息。 - eltaco431
13个回答

33

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

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

1
有趣的是,在我的系统上,安装了8GB内存(或者确切地说是8192MB),系统信息报告显示我只有8155MB。我怀疑并非所有8GB内存都可被系统使用,这可能解释了差异。 - Keith Hill
是的。您的BIOS可能会为BIOS阴影功能映射一定量的内存。 - ravikanth
那么问题是 - OP实际上想要什么?计算机安装的内存还是可供计算机使用的总内存? - Keith Hill
我猜安装的内存。使用systeminfo.exe,你无法获得准确的值,但这是没有WMI的唯一选择,据我所知。 - ravikanth
是的,我正在寻找已安装的内存。谢谢Ravikanth。 - eltaco431
显示剩余2条评论

32

让我们不要过度复杂化事情...

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

19

我想为以后参考的人做个记录。

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

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

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

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

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

get-ciminstance -class "cim_physicalmemory" | % {$_.Capacity}

8
如果机器安装了多个RAM插槽,你的命令将返回一个列表。以下代码将显示总和: (Get-CimInstance -ClassName 'Cim_PhysicalMemory' | Measure-Object -Property Capacity -Sum).Sum - Dark Daskin
为了保险起见,我用 Get-WmiObject 替换了 Get-CimInstance - Kellen Stuart

9

我想说的是,与其使用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

对于那些来自未来的人,如果需要一个可行的解决方案:

(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)上也可以正常工作。


1
我更喜欢使用内置的大小常量将字节转换为MB、KB和GB。$kb = $bytes / 1KB $mb = $bytes / 1MB $gb = $bytes / 1GBhttps://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-powershell-1.0/ee692684(v=technet.10) - Cody Barnes

3
这将从另一个WMI类中获取总金额:
$cs = get-wmiobject -class "Win32_ComputerSystem"
$Mem = [math]::Ceiling($cs.TotalPhysicalMemory / 1024 / 1024 / 1024)

希望这能有所帮助。

1
 Get-ComputerInfo | select -Property OsTotalVisibleMemorySize

1

使用Get-CimInstance可以获得每个内存条的大小,但需要手动相加。因此,我更喜欢在可能的情况下使用Get-WMIObject

(Get-WMIObject Win32_OperatingSystem).TotalVisibleMemorySize  # in KB

38326300

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

31.8008079528809

0

这不是我的创作,但我找到了它,并以人类可读的格式美观地显示了数据。

[Cmdletbinding()] 
Param( 
    [string]$Computername = "."
) 
cls 
$PysicalMemory = Get-WmiObject -class "win32_physicalmemory" -namespace "root\CIMV2" -ComputerName $Computername 
 
Write-Host "Memore Modules:" -ForegroundColor Green 
$PysicalMemory | Format-Table Tag,BankLabel,@{n="Capacity(GB)";e={$_.Capacity/1GB}},Manufacturer,PartNumber,Speed -AutoSize 
 
Write-Host "Total Memory:" -ForegroundColor Green 
Write-Host "$((($PysicalMemory).Capacity | Measure-Object -Sum).Sum/1GB)GB" 
 
$TotalSlots = ((Get-WmiObject -Class "win32_PhysicalMemoryArray" -namespace "root\CIMV2" -ComputerName $Computername).MemoryDevices | Measure-Object -Sum).Sum 
Write-Host "`nTotal Memory Slots:" -ForegroundColor Green 
Write-Host $TotalSlots 
 
$UsedSlots = (($PysicalMemory) | Measure-Object).Count  
Write-Host "`nUsed Memory Slots:" -ForegroundColor Green 
Write-Host $UsedSlots 
 
If($UsedSlots -eq $TotalSlots)
{ 
    Write-Host "All memory slots are in use. No available slots!" -ForegroundColor Yellow 
} 

Powershell ISE 截图


0

经过测试,当远程查询虚拟机时,win32_computerSystem(cim_computerSystem)和win32_operatingSystem(cim_operatingSystem)都能正常工作。其他选项会给出虚假的结果。


你的回答可以通过提供更多支持信息来改进。请编辑以添加进一步的细节,例如引用或文档,以便他人可以确认你的答案是正确的。您可以在帮助中心中找到有关如何编写良好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接