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

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

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

(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?

Ответ 1

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

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

Ответ 2

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

Я хотел избежать 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}

Ответ 3

Id хотел бы сказать, что вместо того, чтобы идти с 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

Ответ 4

Пусть не слишком усложняют вещи...

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

Ответ 5

Это дает вам общую сумму из другого класса WMI:

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

Надеюсь это поможет.

Ответ 6

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

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

Ответ 7

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

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

Ответ 8

Ниже приведена общая физическая память.

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