如何在没有 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 的情况下获取网络适配器的 PnPDeviceId?