Как получить общий размер физической памяти с помощью PowerShell без WMI?

Я пытаюсь получить размер физической памяти с помощью PowerShell, но без использования get-wmiobject.

я использовал следующий командлет PS Для получения размера физической памяти, но значение изменяется с каждым новым опросом.

(get-counter -counter "MemoryAvailable Bytes").CounterSamples[0].CookedValue + 
(get-counter -counter "MemoryCommitted Bytes").CounterSamples[0].CookedValue

В общем, это дает мне значение вокруг: 8605425664 байт

Я также испытывать значение, которое я получаю от добавления этих счетчиков с возвращаемым значением из

(get-wmiobject -class "win32_physicalmemory" -namespace "rootCIMV2").Capacity

это дает мне значение: 8589934592 байты

таким образом, изменяется не только общая физическая память, вычисленная из счетчиков, но и ее значение отличается от значения WMI на пару мегабайт. У кого-нибудь есть идеи о том, как получить размер физической памяти без использования WMI?

5 ответов


Если вы не хотите использовать WMI, я могу предложить systeminfo.исполняемый. Но, возможно, есть лучший способ сделать это.

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

Я хотел бы отметить это для людей, ссылающихся в будущем.

Я хотел избежать WMI, потому что он использует протокол DCOM, требующий, чтобы удаленный компьютер имел необходимые разрешения, которые могут быть установлены только вручную на этом удаленном компьютере.

Итак, я хотел избежать использования WMI, но использование get-counter часто не имело нужного мне счетчика производительности.

решение, которое я использовал, было общей информационной моделью (CIM). В отличие от WMI, По умолчанию CIM не использует DCOM. Вместо возврата объектов WMI командлеты CIM возвращают объекты PowerShell.

CIM использует протокол Ws-MAN по умолчанию, но он работает только с компьютерами, имеющими доступ к Ws-Man 3.0 или более поздней версии. Таким образом, более ранние версии PowerShell не смогут выдавать командлеты CIM.

командлет, который я использовал для получения общего объема физической памяти, был:

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

Id хотел бы сказать, что вместо того, чтобы идти с systeminfo это поможет получить общую физическую память в ГБ на машине

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

для тех, кто приходит сюда из более позднего дня и возраста, и одно рабочее решение:

(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) даже там эта команда, кажется, работает


возможно, не лучшее решение, но оно сработало для меня.

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