【问题标题】:powershell listing Ram informationpowershell 列出 Ram 信息
【发布时间】:2017-04-12 22:36:08
【问题描述】:

我正在尝试找出计算机中的 RAM 类型。我想知道这些模块是 UDIMM、RDIMM、LRDIMM 还是任何其他类型。这将非常有用,因此我可以计划哪些模块将进入数据中心的哪些服务器。

这是我目前所拥有的:

Get-WmiObject Win32_PhysicalMemory |
        Select-Object PSComputerName, DeviceLocator, Manufacturer, PartNumber, 
        @{ label = "Size/GB"; expression = { $_.Capacity / 1GB } },
        Speed, Datawidth, TotalWidth |
        Format-Table -AutoSize

这是有用的信息,但我想要一列告诉我类型(UDIMM、RDIMM、LRDIMM)以及列出空 DIMM 的方法,因为这样可以更容易地查看哪些 DIMM 已满/空(但这不是一个大问题)。

这不是重复的,因为我正在寻找存储在服务器上的 Ram 类型,所以我知道要购买和放入什么 Ram,而无需长途跋涉发现我的类型错误

【问题讨论】:

标签: powershell server ram


【解决方案1】:

Win32_PhysicalMemory class documentation 包含将MemoryType 值转换为内存模块类型的引用。将其转换为哈希表以便于访问:

$MemoryTypeMap = @{
    "0" = 'Unknown'
    "1" = 'Other'
    "2" = 'DRAM'
    "3" = 'Synchronous DRAM'
    "4" = 'Cache DRAM'
    "5" = 'EDO'
    "6" = 'EDRAM'
    "7" = 'VRAM'
    "8" = 'SRAM'
    "9" = 'RAM'
    "10" = 'ROM'
    "11" = 'Flash'
    "12" = 'EEPROM'
    "13" = 'FEPROM'
    "14" = 'EPROM'
    "15" = 'CDRAM'
    "16" = '3DRAM'
    "17" = 'SDRAM'
    "18" = 'SGRAM'
    "19" = 'RDRAM'
    "20" = 'DDR'
    "21" = 'DDR2'
    "22" = 'DDR2 FB-DIMM'
    "24" = 'DDR3'
    "25" = 'FBD2'
}

Get-WmiObject Win32_PhysicalMemory |Select @{Label = 'Type';Expression = {$MemoryTypeMap["$($_.MemoryType)"]}}

【讨论】:

  • 这很好用,但在本地计算机上测试过,而且都说未知这不会让我到任何地方:(
  • 好吧,如果 Windows 不知道,那么如果不查找供应商文档中的部分,您将无能为力
  • 当我运行 @MathiasR.Jessen 的建议时,它会为我的计算机报告 DDR3。你应该在你的生产电脑上试试这个,有些可能会报告答案,有些可能不会。对于那些不这样做的人,您将不得不手动研究哪个部件号等于哪种类型的 RAM,并且在我的答案和他的答案之间,您正在走向成功:)
【解决方案2】:

您可以使用CIM_PhyicalMemoryArrayCIM_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 属性来手动查找它。经过几次迭代,您应该能够收集数据并编写自己的异常,然后结束此任务。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-04-30
    • 2017-02-02
    • 2013-10-07
    • 2011-08-06
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2019-06-05
    相关资源
    最近更新 更多