您可以使用CIM_PhyicalMemoryArray 和CIM_MemoryDeviceLocation 的WMI 类查看哪些内存设备位于哪些插槽中。但是,我使用了 WBEMTest 和 Get-CimInstance,但 Windows 似乎没有报告主板上打开了哪些内存插槽。
我的最佳猜测?您需要使用Win32_Baseboard 类来报告主板的型号,并手动进行一些工作以查看每个型号有多少插槽。然后,您可以使用来自 CIM_MemoryDeviceLocation 的数据来确定有多少插槽处于打开状态。
这样做的方法可能如下所示。
$memorySlots = Get-CimInstance Win32_MemoryDeviceLocation
$motherBoard = Get-CimInstance win32_baseboard
switch ($motherBoard.Product){
#find the motherboard models for the most common models and populate manually w/ count of ram slots
"0TM99H" {$Totalslots = 2}
Default {$Totalslots = 4}
}
Get-WmiObject Win32_PhysicalMemory |
Select-Object PSComputerName, DeviceLocator, Manufacturer, PartNumber,
@{ label = "Size/GB"; expression = { $_.Capacity / 1GB } },
Speed, Datawidth, TotalWidth, @{ label ="FreeSlots";exp={$Totalslots-$memorySlots.Count}}
看起来像这样:
PSComputerName : SLVER
DeviceLocator : DIMM A
Manufacturer : Elpida
PartNumber : 8KTS51264HDZ-1G6E1
Size/GB : 4
Speed : 1600
Datawidth : 64
TotalWidth : 64
FreeSlots : 0
PSComputerName : SLVER
DeviceLocator : DIMM B
Manufacturer : Elpida
PartNumber : 8KTS51264HDZ-1G6E1
Size/GB : 4
Speed : 1600
Datawidth : 64
TotalWidth : 64
FreeSlots : 0
最后,您询问了内存类型,从 WMI 的角度来看,这似乎也不是我们所知道的信息。或者更确切地说,如果 WMI 确实知道它,我在任何地方都找不到它。
我认为你也需要在那里做一些手动工作,收集内存部件号,然后手动研究以确定它是什么类型的 RAM,最后通过添加另一个 Switch 语句将该信息添加到输出中,如显示。
switch ($memorySpecs.PartNumber){
"8KTS51264HDZ-1G6E1" {$RAMType='SoDimm'}
Default {$RAMType="Unknown, research $($memorySpecs.PartNumber)"}
}
更新
如果 PC 上的 BIOS 向 Windows 报告 RAM,Mathias 提供了一种出色的方法来查找 RAM。我已经在一些系统上进行了测试,有些系统报告了它们的 RAM 类型,而有些则没有。对于那些不这样做的人,您可以参考我在上面演示的 partNumber 属性来手动查找它。经过几次迭代,您应该能够收集数据并编写自己的异常,然后结束此任务。