需要帮助以使用POWERSHELL获取阵列中的XML值

问题描述:

我在HPE服务器上有FIRMWARE CHECK脚本的XML输出。 我想创建一个数组来为每个索引定义FIRMWARE_NAME VALUE = FIRMWARE_VERSION VALUE需要帮助以使用POWERSHELL获取阵列中的XML值

正如你所看到的这条道路是不相符的,有可以从服务器或多或少索引服务器,从而创建一个循环失败,可能是因为我不擅长使用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 = 2.40 2015年12月2日

系统ROM在= I31 2015年6月1日

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

智能置备= 1.62.31

智能平台抽象数据= 1.55

系统ROM引导块= 41338

电源管理控制器固件= 3.3

电源管理控制器固件的bootloader = 2.7

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

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

智能阵列P220i控制器= 6.68

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

+0

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

我试图只是添加这个作为评论马丁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的子节点间循环,以便使用固件名称和固件值向自定义对象添加新属性。

+0

是的,那就是我的意思。您也可以将'$ FirmwareVersions'分配给'$ xml ...'。无需声明它,+ =添加对象;-) –

+0

好点。我简化了我的答案。 –

+0

感谢您的帮助,我尝试了您提供的各种组合,感谢您的快速回复。 –

你可以只是检索FIRMWARE_INFORMATION节点的childNodes并在它们之间迭代:

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

+0

感谢您的帮助,我尝试了您提供的各种组合,感谢您的快速回复。 –