Использование упрощенного документа $ xml, чтобы показать мою проблему…
$xml = [xml]'
<root>
<Item IDValue="123456" Date="2019-10-01" ItemType="Test">
<Info Timestamp="2019-10-01T00:00:00+01:00" Value="1"/>
<Info Timestamp="2019-10-01T00:15:00+01:00" Value="2"/>
<Info Timestamp="2019-10-01T00:30:00+01:00" Value="3"/>
<Info Timestamp="2019-10-01T00:45:00+01:00" Value="4"/>
</Item>
</root>'
Цель состоит в том, чтобы взять узлы Info и транспонировать значение в виде столбцов вместе с атрибутами Item, используя метку времени в качестве отформатированного заголовка столбца. в ЧЧ: мм
Я пробовал вычисленное свойство, которое использует ForEach-Object…
$xml.root.Item | Select-Object IDValue, Date, ItemType, @{N='DataVal';E={$_.Info | ForEach-Object {@{"$((Get-Date $_.Timestamp).ToString('HH:mm'))"=$_.Value}}}}
Сначала я надеялся, что смогу затем расширить «DataVal» в другой Select-Object, чтобыэффективно поворачивать (или транспонировать) значения в столбцы, например,
$xml.root.Item | Select-Object IDValue, Date, ItemType, @{N='DataVal';E={$_.Info | ForEach-Object {@{"$((Get-Date $_.Timestamp).ToString('HH:mm'))"=$_.Value}}}} |
Select-Object IDValue, Date, ItemType -ExpandProperty DataVal | Format-Table
Но это не работает. Единственный способ получить желаемый результат - это перечислить все возможные временные метки ...
$xml.root.Item | Select-Object IDValue, Date, ItemType, @{N='DataVal';E={$_.Info | ForEach-Object {@{"$((Get-Date $_.Timestamp).ToString('HH:mm'))"=$_.Value}}}} |
Select-Object IDValue, Date, ItemType,
@{N='00:00';E={$_.DataVal.'00:00'}},
@{N='00:15';E={$_.DataVal.'00:15'}},
@{N='00:30';E={$_.DataVal.'00:30'}},
@{N='00:45';E={$_.DataVal.'00:45'}} |
Format-Table
Это не идеально, потому что некоторые xmls измеряют разное время, и их будет многобольше 4! Выше приведена простая урезанная версия
Я думаю, что использование ForEach-Object выводит массив хеш-таблиц, что делает его неподходящим для -ExpandProperty для работы так, как я хочу?
Любое предложение о том, в каком направлении идти отсюда ??
Спасибо