需要帮助以使用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
我试图只是添加这个作为评论马丁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 ...'。无需声明它,+ =添加对象;-) –
好点。我简化了我的答案。 –
感谢您的帮助,我尝试了您提供的各种组合,感谢您的快速回复。 –
你可以只是检索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对象的内容...
感谢您的帮助,我尝试了您提供的各种组合,感谢您的快速回复。 –
问题是回答,我不知道如何关闭该线程,可以管理员帮助我。 –