PowerShell:带有ConvertTo-XML输出的自定义属性XML标记

时间:2013-11-12 16:51:05

标签: xml powershell hash psobject

我在PowerShell中创建一个新对象,使用哈希表来设置属性值。我想使用ConvertTo-XML方法将对象导出为XML格式。

$hash = @{            
    Processor = 'Intel'                
    Disk = '500GB'
    Server = 'ABC'
    Serial = '01234'
}                           

$specs = New-Object PSObject -Property $hash
Write-Output ($specs | ConvertTo-XML -notypeinformation).Save("C:\scripts\export.xml")

XML输出如下:

<Objects>
  <Object>
    <Property Name="Serial">a1b2c3</Property>
    <Property Name="Server">ABC</Property>
    <Property Name="Processor">Intel</Property>
    <Property Name="Disk">500GB</Property>
  </Object>
</Objects>

我想要的是,XML标签的格式如下:

<Objects>
  <Object>
    <Serial>a1b2c3</Serial>
    <Server>ABC</Server>
    <Processor>Intel</Processor>
    <Disk>500GB</Disk>
  </Object>
</Objects>

然后,如果有一个很好的解决方案,是否还有一种方法可以自定义Object(s)标签?

谢谢。

4 个答案:

答案 0 :(得分:7)

我认为你不能用ConvertTo-Xml到达那里。但是,您可以使用here strings执行此操作。它有点低技术但仍然很酷:

$hash = @{            
    Processor = 'Intel'                
    Disk = '500GB'
    Server = 'ABC'
    Serial = '01234'
}                           

@"
<Objects>
  <Object>$(foreach ($kvpair in $hash.GetEnumerator()) {
    "`n    <$($kvpair.Key)>$($kvpair.Value)</$($kvpair.Key)>"
})
  </Object>
</Objects>
"@ > C:\scripts\export.xml

您可以使用XML DOM来创建此文档,但这样做会更多,对于这样一个简单的文档,我认为here string方法非常有效。它也适用于任何类型的文本模板。

答案 1 :(得分:3)

这是一个单行:

$specs |% {'<Objects>'} {$_.psobject.properties |% {'  <Object>'} {"    <$($_.name)>$($_.value)<\$($_.name)>"} {'  <\Object>'} } {'<\Objects>'}

答案 2 :(得分:3)

Mjolinor的一个内联对于以上述XML格式输出Powershell自定义对象表非常有用。但是它有一个错误 - 结束&#34; /&#34; xml标签是错误的方式。这意味着XML代码无效并且提供了一个&#39;&#34; XML解析错误:格式不正确&#34;&#39;错误。我花了一些时间来弄清楚出了什么问题,这是纠正后的代码,所以其他人不必再弄清楚了:

    $SelectedResults |% {'<Objects>'} {$_.psobject.properties |% {'  <Object>'} {"    <$($_.name)>$($_.value)</$($_.name)>"} {'  </Object>'} } {'</Objects>'}

其中$ SelectedResults是PS Custom对象的输出。

您可以测试XML输出,如果它在此处有效 - https://www.w3schools.com/xml/xml_validator.asp

答案 3 :(得分:0)

所选答案对我有用,但我不得不改变这一行

"`n    <$($kvpair.Key)>$($kvpair.Value)</$($kvpair.Key)>"

"`n    <$($kvpair.Keys)>$($kvpair.Values)</$($kvpair.Keys)>"

键和值而不是键和值

此外,如果您希望在记事本中显示空格,请使用

`r`n

(我没有足够的声誉对答案发表评论)