9

我在 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

5 回答 5

8

我不认为你可以到达那里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方法效果很好。它也适用于任何类型的文本模板。

于 2013-11-12T17:37:57.650 回答
4

这是一个单行:

$specs |% {'<Objects>'} {$_.psobject.properties |% {'  <Object>'} {"    <$($_.name)>$($_.value)</$($_.name)>"} {'  </Object>'} } {'</Objects>'}
于 2013-11-12T17:50:36.503 回答
3

Mjolinor 的一个衬垫对于以上述 XML 格式从 Powershell 自定义对象表输出非常有用。但是其中有一个错误 - 关闭“/”xml标记是错误的方式。这意味着 XML 代码无效并给出“XML Parsing Error: not well-formed”错误。我花了一段时间才弄清楚出了什么问题,这里是更正后的代码,这样其他人就不必再弄明白了:

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

其中 $SelectedResults 是 PS 自定义对象的输出。

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

于 2018-02-02T12:23:11.780 回答
0

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

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

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

键和值而不是键和值

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

`r`n

(我没有足够的声誉来评论答案)

于 2018-03-26T19:04:37.383 回答
0

如果您像我一样无法理解单行答案,请在此处展开​​:

$specs | ForEach-Object `
    -begin {'<Objects>'} `
    -process {$_.psobject.properties | ForEach-Object `
        -begin {'  <Object>'} `
        -process {"    <$($_.name)>$($_.value)</$($_.name)>"} `
        -end {'  </Object>'} } `
    -end {'</Objects>'} | out-file "C:\scripts\export.xml"
于 2022-01-28T11:08:58.383 回答