web-dev-qa-db-ja.com

WMIなしでPowerShellを使用して物理メモリの合計サイズを取得するにはどうすればよいですか?

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を使用せずに物理メモリサイズを取得する方法についてのアイデアはありますか?

12
eltaco431

WMIを使用したくない場合は、systeminfo.exeを提案できます。しかし、それを行うより良い方法があるかもしれません。

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

将来参照する人のために、このことを書き留めたいと思います。

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}
11
eltaco431

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
7
Vigneshbabu

複雑になりすぎないようにしましょう...:

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

これにより、別のWMIクラスから合計金額が得られます。

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

お役に立てれば。

1
NVLMagic

最善の解決策ではないかもしれませんが、私にとってはうまくいきました。

[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)までこれをテストしましたが、このコマンドは機能しているようです

0
Joel Harkes