Arrays 需要帮助使用POWERSHELL获取数组中的XML值吗

Arrays 需要帮助使用POWERSHELL获取数组中的XML值吗,arrays,xml,powershell,xml-parsing,Arrays,Xml,Powershell,Xml Parsing,我有一个来自HPE服务器上固件检查脚本的XML输出。 我想创建一个数组,为每个索引定义固件\u名称值=固件\u版本值 正如您所看到的,路径不一致,服务器之间可能有或多或少的索引,因此创建循环失败,可能是因为我对PowerShell也不熟悉,因此寻求帮助 演示脚本如下: $xml = [xml]@" <HEAD> <RIBCL VERSION="2.23"> <RESPONSE STATUS="0x0000"

我有一个来自HPE服务器上固件检查脚本的XML输出。 我想创建一个数组,为每个索引定义
固件\u名称值
=
固件\u版本值

正如您所看到的,路径不一致,服务器之间可能有或多或少的索引,因此创建循环失败,可能是因为我对PowerShell也不熟悉,因此寻求帮助

演示脚本如下:

$xml = [xml]@"
<HEAD>
<RIBCL VERSION="2.23">
<RESPONSE
    STATUS="0x0000"
    MESSAGE='No error'
     />
<GET_EMBEDDED_HEALTH_DATA>
     <FIRMWARE_INFORMATION>
          <INDEX_1>
               <FIRMWARE_NAME VALUE = "iLO"/>
               <FIRMWARE_VERSION VALUE = "2.40 Dec 02 2015"/>
          </INDEX_1>
          <INDEX_2>
               <FIRMWARE_NAME VALUE = "System ROM"/>
               <FIRMWARE_VERSION VALUE = "I31 06/01/2015"/>
          </INDEX_2>
          <INDEX_3>
               <FIRMWARE_NAME VALUE = "Redundant System ROM"/>
               <FIRMWARE_VERSION VALUE = "I31 04/01/2015"/>
          </INDEX_3>
          <INDEX_4>
               <FIRMWARE_NAME VALUE = "Intelligent Provisioning"/>
               <FIRMWARE_VERSION VALUE = "1.62.31"/>
          </INDEX_4>
          <INDEX_5>
               <FIRMWARE_NAME VALUE = "Intelligent Platform Abstraction Data"/>
               <FIRMWARE_VERSION VALUE = "1.55"/>
          </INDEX_5>
          <INDEX_6>
               <FIRMWARE_NAME VALUE = "System ROM Bootblock"/>
               <FIRMWARE_VERSION VALUE = "03/05/2013"/>
          </INDEX_6>
          <INDEX_7>
               <FIRMWARE_NAME VALUE = "Power Management Controller Firmware"/>
               <FIRMWARE_VERSION VALUE = "3.3"/>
               <FIRMWARE_FAMILY VALUE = "0Ch"/>
          </INDEX_7>
          <INDEX_8>
               <FIRMWARE_NAME VALUE = "Power Management Controller Firmware Bootloader"/>
               <FIRMWARE_VERSION VALUE = "2.7"/>
          </INDEX_8>
          <INDEX_9>
               <FIRMWARE_NAME VALUE = "System Programmable Logic Device"/>
               <FIRMWARE_VERSION VALUE = "Version 0x13"/>
          </INDEX_9>
          <INDEX_10>
               <FIRMWARE_NAME VALUE = "Server Platform Services (SPS) Firmware"/>
               <FIRMWARE_VERSION VALUE = "2.1.7.E7.4"/>
          </INDEX_10>
          <INDEX_11>
               <FIRMWARE_NAME VALUE = "Smart Array P220i Controller"/>
               <FIRMWARE_VERSION VALUE = "6.68"/>
          </INDEX_11>
          <INDEX_12>
               <FIRMWARE_NAME VALUE = "HP FlexFabric 10Gb 2-port 554FLB Adapter"/>
               <FIRMWARE_VERSION VALUE = "10.5.155.0"/>
          </INDEX_12>
     </FIRMWARE_INFORMATION>
</GET_EMBEDDED_HEALTH_DATA>
</RIBCL>
</HEAD>
"@
$xml=[xml]@”
"@
预期输出:在数组中

国际劳工局=2.40 2015年12月2日

系统ROM=I31 06/01/2015

冗余系统ROM=I31 04/01/2015

智能资源调配=1.62.31

智能平台抽象数据=1.55

系统ROM引导块=41338

电源管理控制器固件=3.3

电源管理控制器固件引导加载程序=2.7

系统可编程逻辑器件=版本0x13

服务器平台服务(SPS)固件=2.1.7.E7.4

智能阵列P220i控制器=6.68

HP FlexFabric 10Gb 2端口554FLB适配器=10.5.155.0


您只需检索
FIRMWARE\u信息
节点的子节点并对其进行迭代即可:

$xml.DocumentElement.RIBCL.GET_EMBEDDED_HEALTH_DATA.FIRMWARE_INFORMATION.ChildNodes | 
    ForEach-Object { "{0} = {1}" -f $_.FIRMWARE_NAME.Value, $_.FIRMWARE_VERSION.Value}
输出:

iLO = 2.40 Dec 02 2015
System ROM = I31 06/01/2015
Redundant System ROM = I31 04/01/2015
Intelligent Provisioning = 1.62.31
Intelligent Platform Abstraction Data = 1.55
System ROM Bootblock = 03/05/2013
Power Management Controller Firmware = 3.3
Power Management Controller Firmware Bootloader = 2.7
System Programmable Logic Device = Version 0x13
Server Platform Services (SPS) Firmware = 2.1.7.E7.4
Smart Array P220i Controller = 6.68
HP FlexFabric 10Gb 2-port 554FLB Adapter = 10.5.155.0

注意:这将创建一个字符串数组。如果你想得到一个哈希表,因为你想检索一个键的值,你必须采用foreach对象内容…

我试图把它作为注释添加到Martin Brandl的答案中,但我无法使代码的格式看起来正确

要扩展Martin Brandl的答案,如果您希望以对象形式显示结果,可以执行以下操作:

$FirmwareVersions = $xml.DocumentElement.RIBCL.GET_EMBEDDED_HEALTH_DATA.FIRMWARE_INFORMATION.ChildNodes | ForEach-Object {
    [pscustomobject]@{
        Name = $_.FIRMWARE_NAME.Value;
        Version = $_.FIRMWARE_VERSION.Value
    }
}
根据您的评论

如果您希望一个具有属性名称的对象是不同的设备,而值是固件级别(然后导出为CSV),我将这样做:

$FirmwareVersions = New-Object -TypeName PSObject
$xml.DocumentElement.RIBCL.GET_EMBEDDED_HEALTH_DATA.FIRMWARE_INFORMATION.ChildNodes | ForEach-Object {
    $FirmwareVersions | Add-Member -MemberType NoteProperty -Name $_.FIRMWARE_NAME.Value -Value $_.FIRMWARE_VERSION.Value
}
$FirmwareVersions | Export-Csv -NoTypeInformation -Path .\FirmwareVersions.csv

可能会有一个简短的语法来做这件事,但这是我最自然的方式。代码创建一个新的自定义对象,然后循环遍历XML的子节点,以向自定义对象添加一个新属性,该属性包含固件名称和固件值。

是的,这就是我的意思。您也可以只将
$FirmwareVersions
分配给
$xml…
。无需声明它和+=添加对象;-)谢谢你们的帮助,我正在尝试你们两人提供的各种组合,谢谢你们的快速回复。我尝试了你们的解决方案,这几乎是我所需要的。我正在尝试将此输出导出到CSV文件中,其中列标题将是固件名称,版本将在后续行中,当我使用您的方法时,我将在列标题中获取名称/版本,在行中获取固件名称和版本。确定,我刚刚编辑并添加了另一种方式,可以让你找到你想要的…非常感谢这是我一直在寻找的东西。谢谢你的帮助,我正在尝试由你们两人提供的各种组合,谢谢你的快速回复。问题已经回答,我不确定如何关闭线程,管理员可以帮助我吗。