Ответ 1
Если вы не хотите использовать WMI, я могу предложить systeminfo.exe. Но, может быть, лучший способ сделать это.
(systeminfo | Select-String 'Total Physical Memory:').ToString().Split(':')[1].Trim()
Я пытаюсь получить размер физической памяти с помощью 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?
Если вы не хотите использовать WMI, я могу предложить systeminfo.exe. Но, может быть, лучший способ сделать это.
(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, это помогло бы получить полную физическую память в 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
Пусть не слишком усложняют вещи...
(Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb
Это дает вам общую сумму из другого класса WMI:
$cs = get-wmiobject -class "Win32_ComputerSystem"
$Mem = [math]::Ceiling($cs.TotalPhysicalMemory / 1024 / 1024 / 1024)
Надеюсь это поможет.
Для тех, кто приезжает сюда с более позднего возраста и одного рабочего решения:
(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), даже там эта команда работает
Возможно, не лучшее решение, но оно сработало для меня.
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")
$VBObject=[Microsoft.VisualBasic.Devices.ComputerInfo]::new()
$SystemMemory=$VBObject.TotalPhysicalMemory
Ниже приведена общая физическая память.
gwmi Win32_OperatingSystem | Measure-Object -Property TotalVisibleMemorySize -Sum | % {[Math]::Round($_.sum/1024/1024)}