PowerShell: пользовательские XML-Теги свойств с выводом ConvertTo-XML

Я создаю новый объект в PowerShell, используя хэш-таблицу для задания значений свойств. Затем я хочу экспортировать объект в формат XML с помощью метода ConvertTo-XML.

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

$specs = New-Object PSObject -Property $hash
Write-Output ($specs | ConvertTo-XML -notypeinformation).Save("C:scriptsexport.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>

и затем, если есть хорошее решение для этого, есть ли также способ сделать пользовательские теги объектов?

спасибо вы.

4 ответов


Я не думаю, что вы можете попасть туда с 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 подход работает довольно хорошо. Это также хорошо для любого вида текстовых шаблонов.


вот однострочный:

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

одна строка Mjolinor очень полезна для вывода из пользовательских таблиц объектов Powershell в формате XML, описанном выше. Однако в нем есть ошибка-закрывающий xml-тег " / " является неправильным способом. Это означает, что XML-код недействителен и дает ошибку"ошибка синтаксического анализа XML: не сформирована". Мне потребовалось некоторое время, чтобы понять, что было не так, вот исправленный код, чтобы другим не пришлось выяснять это снова:

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

где $SelectedResults является выходом пользовательский объект PS.

вы можете проверить вывод XML, и если он действителен здесь -https://www.w3schools.com/xml/xml_validator.asp


выбранный ответ работал для меня, но мне пришлось изменить эту строку

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

to

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

ключи и значения вместо ключа и значения

также, если вы хотите, чтобы пробелы были видны в блокноте, используйте

`r`n

(у меня недостаточно репутации, чтобы прокомментировать ответ)