【问题标题】:How do I get total physical memory size using PowerShell without WMI?如何在没有 WMI 的情况下使用 PowerShell 获取总物理内存大小?
【发布时间】: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 权限,因此没有权限的用户将无法获取此信息。

标签: powershell memory byte wmi


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

            【讨论】:

            【解决方案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 的唯一选择。
              • 是的。我正在寻找已安装的内存。谢谢拉维坎特。
              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-03-13
              • 2011-10-18
              相关资源
              最近更新 更多