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

Posted

技术标签:

【中文标题】如何在没有 WMI 的情况下使用 PowerShell 获取总物理内存大小?【英文标题】:How do I get total physical memory size using PowerShell without WMI? 【发布时间】:2013-07-14 21:51:41 【问题描述】:

我正在尝试使用 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 的情况下获取物理内存大小有任何想法吗?

【问题讨论】:

你想要什么?物理磁盘还是物理内存?您的示例显示了物理内存,您的问题是关于物理磁盘的。 对不起。我把他们弄糊涂了。我想要物理内存大小。我会编辑我的问题。谢谢! 只是出于好奇,为什么要避免 WMI? 我避免使用 WMI,因为它需要 DCOM 权限,因此没有权限的用户将无法获取此信息。 【参考方案1】:

这不是我的创作,但我发现了它,它以人类可读的格式精美地显示了数据。

[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 Screenshot

【讨论】:

【参考方案2】:

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

(Get-WMIObject Win32_OperatingSystem).TotalVisibleMemorySize  # in KB

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

31.8008079528809

【讨论】:

【参考方案3】:

下面给出了总物理内存。

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

【讨论】:

【参考方案4】:

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

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

【讨论】:

最好的KISS校长! 很棒的解决方案 TYVM【参考方案5】:

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

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

希望这会有所帮助。

【讨论】:

【参考方案6】:

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

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

【讨论】:

【参考方案7】:

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

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

【讨论】:

我更喜欢使用内置的大小常量将字节转换为 MB、KB 和 GB。 $kb = $bytes / 1KB $mb = $bytes / 1MB $gb = $bytes / 1GB docs.microsoft.com/en-us/previous-versions/windows/it-pro/…【参考方案8】:

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

【讨论】:

【参考方案9】:

我想把这点记下来,供以后参考的人参考。

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

【讨论】:

如果机器安装了多个 RAM 组,您的命令将返回一个列表。以下会显示总数:(Get-CimInstance -ClassName 'Cim_PhysicalMemory' | Measure-Object -Property Capacity -Sum).Sum 我用 Get-WmiObject 替换了 Get-CimInstance 以更好地衡量【参考方案10】:

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

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

【讨论】:

有趣的是,在我安装了 8GB(或正好是 8192MB)的系统上,系统信息报告我总共有 8155MB。我怀疑并非所有 8GB 都可供系统使用,这可能是造成差异的原因。 是的。您的 Bios 可能正在为 BIOS 映射功能映射一定数量的内存。 所以问题是 - OP 实际上是什么?已安装的内存或可供计算机使用的总内存? 我猜是装了内存。使用 systeminfo.exe,您实际上无法获得准确的值,但这是没有 WMI、AFAIK 的唯一选择。 是的。我正在寻找已安装的内存。谢谢拉维坎特。

以上是关于如何在没有 WMI 的情况下使用 PowerShell 获取总物理内存大小?的主要内容,如果未能解决你的问题,请参考以下文章

WMI 如何获取 ProcessorId?

是否可以在不使用 WMI 的情况下获取网络适配器的 PnPDeviceId?

在没有远程 powershell 或 WMI 的情况下获取远程 SMB/CIFS 共享的权限

在不使用 WMI 的情况下访问主板信息

如何使用 WMI 了解进程的 CPU 和内存使用情况?

如何在 Python 中不使用 WMI 获取 PhysicalDisk?