19

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

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

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

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

我还在测试通过将这些计数器与返回值相加得到的值

(get-wmiobject -class "win32_physicalmemory" -namespace "root\CIMV2").Capacity

这给了我价值:8589934592 字节

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

4

10 回答 10

30

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

(systeminfo | Select-String 'Total Physical Memory:').ToString().Split(':')[1].Trim()
于 2013-07-16T16:11:19.850 回答
18

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

(Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb
于 2019-02-21T15:29:43.943 回答
15

我想记下这一点,以供将来参考的人参考。

我想避免使用 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}
于 2013-07-17T16:52:28.033 回答
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
于 2016-08-03T17:34:54.013 回答
2

对于那些从较晚的时代来到这里的人,以及一个可行的解决方案:

(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) 之前测试了这个,即使这个命令似乎工作

于 2017-09-01T08:38:41.467 回答
2

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

$cs = get-wmiobject -class "Win32_ComputerSystem"
$Mem = [math]::Ceiling($cs.TotalPhysicalMemory / 1024 / 1024 / 1024)

希望这可以帮助。

于 2018-11-06T11:49:02.353 回答
0

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

[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")
$VBObject=[Microsoft.VisualBasic.Devices.ComputerInfo]::new()
$SystemMemory=$VBObject.TotalPhysicalMemory
于 2018-05-31T15:42:25.263 回答
0

下面给出了总物理内存。

gwmi Win32_OperatingSystem | Measure-Object -Property TotalVisibleMemorySize -Sum | % {[Math]::Round($_.sum/1024/1024)}
于 2019-10-11T06:12:08.027 回答
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 屏幕截图

于 2021-09-22T18:50:23.180 回答
0

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

(Get-WMIObject Win32_OperatingSystem).TotalVisibleMemorySize  # in KB

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

31.8008079528809
于 2021-06-17T14:02:06.227 回答