可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
I'm trying to get the physical memory size using PowerShell, but without using get-wmiobject.
I have been using the following PS cmdlet to get the physical memory size, but the value changes with each new poll.
(get-counter -counter "\Memory\Available Bytes").CounterSamples[0].CookedValue +
(get-counter -counter "\Memory\Committed Bytes").CounterSamples[0].CookedValue
In general, this gives me a value around: 8605425664 bytes
I'm also testing the value I get from adding these counters with the returned value from
(get-wmiobject -class "win32_physicalmemory" -namespace "root\CIMV2").Capacity
This gives me the value: 8589934592 bytes
So, not only is the total physical memory calculated from counters changing, but it's value differs from the WMI value by a couple megabytes. Anyone have any ideas as to how to get the physical memory size without using WMI?
回答1:
If you don't want to use WMI, I can suggest systeminfo.exe. But, there may be a better way to do that.
(systeminfo | Select-String 'Total Physical Memory:').ToString().Split(':')[1].Trim()
回答2:
I'd like to make a note of this for people referencing in the future.
I wanted to avoid WMI because it uses a DCOM protocol, requiring the remote computer to have the necessary permissions, which could only be setup manually on that remote computer.
So, I wanted to avoid using WMI, but using get-counter often times didn't have the performance counter I wanted.
The solution I used was the Common Information Model (CIM). Unlike WMI, CIM doesn't use DCOM by default. Instead of returning WMI objects, CIM cmdlets return PowerShell objects.
CIM uses the Ws-MAN protocol by default, but it only works with computers that have access to Ws-Man 3.0 or later. So, earlier versions of PowerShell wouldn't be able to issue CIM cmdlets.
The cmdlet I ended up using to get total physical memory size was:
get-ciminstance -class "cim_physicalmemory" | % {$_.Capacity}
回答3:
Id like to say that instead of going with the systeminfo this would help over to get the total physical memory in GB's the machine
Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum | Foreach {"{0:N2}" -f ([math]::round(($_.Sum / 1GB),2))}
you can pass this value to the variable and get the gross output for the total physical memory in the machine
$totalmemory = Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum | Foreach {"{0:N2}" -f ([math]::round(($_.Sum / 1GB),2))}
$totalmemory
回答4:
Let's not over complicate things...:
(Get-CimInstance Win32_PhysicalMemory | Measure-Object -Property capacity -Sum).sum /1gb
回答5:
This gives you the total amount from another WMI class:
$cs = get-wmiobject -class "Win32_ComputerSystem"
$Mem = [math]::Ceiling($cs.TotalPhysicalMemory / 1024 / 1024 / 1024)
Hope this helps.
回答6:
For those coming here from a later day and age and one a working solution:
(Get-WmiObject -class "cim_physicalmemory" | Measure-Object -Property Capacity -Sum).Sum
this will give the total sum of bytes.
$bytes = (Get-WmiObject -class "cim_physicalmemory" | Measure-Object -Property Capacity -Sum).Sum
$kb = $bytes / 1024
$mb = $bytes / 1024 / 1024
$gb = $bytes / 1024 / 1024 / 1024
I tested this up to windows server 2008 (winver 6.0) even there this command seems to work
回答7:
Maybe not the best solution, but it worked for me.
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")
$VBObject=[Microsoft.VisualBasic.Devices.ComputerInfo]::new()
$SystemMemory=$VBObject.TotalPhysicalMemory
回答8:
Below gives the total physical memory.
gwmi Win32_OperatingSystem | Measure-Object -Property TotalVisibleMemorySize -Sum | % {[Math]::Round($_.sum/1024/1024)}