【问题标题】:Need Help To Get XML Values In Array Using POWERSHELL需要帮助以使用 POWERSHELL 获取数组中的 XML 值
【发布时间】:2016-12-11 02:35:47
【问题描述】:

我有一个来自 HPE 服务器上的固件检查脚本的 XML 输出。 我想创建一个数组来为每个索引定义FIRMWARE_NAME VALUE = FIRMWARE_VERSION VALUE

如您所见,Path 不一致,服务器之间可能存在或多或少的索引,因此创建循环失败,可能是因为我也不擅长 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>
"@

预期输出:在数组中

iLO= 2015 年 12 月 2 日 2.40

系统 ROM= I31 06/01/2015

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

智能配置= 1.62.31

智能平台抽象数据= 1.55

系统 ROM 引导块 = 41338

电源管理控制器固件= 3.3

电源管理控制器固件 Bootloader= 2.7

系统可编程逻辑设备 = 版本 0x13

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

智能阵列 P220i 控制器 = 6.68

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

【问题讨论】:

  • 问题已回答,我不知道如何关闭线程,可以管理员帮助我。

标签: arrays xml powershell xml-parsing


【解决方案1】:

我尝试将此作为注释添加到 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
    }
}

根据您的 cmets

如果您希望一个对象的属性名称是不同的设备,值是固件级别(然后导出到 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 文件中,其中列标题将是固件名称,版本将在后续行中,当我使用您的方法时,我在列标题中获取名称/版本,在行中获取固件名称和版本.
  • 好的,我刚刚编辑并添加了另一种方式,可以为您提供所需的内容...
  • 非常感谢,这就是我要找的东西。
【解决方案2】:

您可以只检索 FIRMWARE_INFORMATION 节点的 ChildNode 并对其进行迭代:

$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 对象内容...

【讨论】:

  • 感谢您的帮助,我正在尝试你们提供的各种组合,感谢您的快速回复。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-30
相关资源
最近更新 更多