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を避けたいと思いました。
そのため、WMIの使用を避けたかったのですが、get-counterを使用することで、必要なパフォーマンスカウンターが得られないことがよくありました。
私が使用したソリューションは、Common Information Model(CIM)です。 WMIとは異なり、CIMはデフォルトでDCOMを使用しません。 WIMオブジェクトを返す代わりに、CIMコマンドレットはPowerShellオブジェクトを返します。
CIMはデフォルトでWs-MANプロトコルを使用しますが、Ws-Man 3.0以降にアクセスできるコンピューターでのみ機能します。そのため、PowerShellの以前のバージョンではCIMコマンドレットを発行できませんでした。
合計物理メモリサイズを取得するために使用したコマンドレットは次のとおりです。
get-ciminstance -class "cim_physicalmemory" | % {$_.Capacity}
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)
お役に立てれば。
最善の解決策ではないかもしれませんが、私にとってはうまくいきました。
[System.Reflection.Assembly]::LoadWithPartialName("Microsoft.VisualBasic")
$VBObject=[Microsoft.VisualBasic.Devices.ComputerInfo]::new()
$SystemMemory=$VBObject.TotalPhysicalMemory
後日、年齢を問わずここに来て、1つの実用的なソリューションを提供します:
(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)までこれをテストしましたが、このコマンドは機能しているようです