Итак, у вас есть объект, где значением свойства является массив объектов. Как вы хотите вывести это? Вы можете использовать Select-Object
для создания пользовательского объекта, определяющего свойства на основе исходного объекта, или вы можете перебирать объекты в цикле ForEach-Object
и создавать объекты таким образом. Я приведу примеры каждого из них.
Select-Object
метод:
$SourceObject | Select ID,name,backupBillableSpaceGb,@{l='CompanyName';e={$_.company.name}},@{l='Contracted Protected Data Size (TB)';e={$_.questions|Where{$_.question -eq 'Contracted Protected Data Size (TB)'}|Select -expand answer}}
Это делает очень длинные строки и становится действительно трудным для чтения, но оно сохраняет все это встроенными. В этих примерах я построил свойства в формате @{label='Property Name';expression={Property Value}}
, используя более короткие «l» для «label» и «e» для «expression».
ForEach-Object
метод:
$SourceObject | ForEach{
[PSCustomObject]@{
ID = $_.id
Name = $_.name
CompanyName = $_.company.name
'Contracted Protected Data Size (TB)' = $_.questions|Where{$_.question -eq 'Contracted Protected Data Size (TB)'}|Select -expand answer
}
}
Это должно создать тот же вывод, но обычно его легче читать. Хотя это занимает гораздо больше места.
Это, однако, имеет некоторые преимущества, такие как: Если это становится очень медленным, из-за необходимости многократно проходить по массиву $_.questions
, вы можете создать хеш-таблицу из этого массива и ссылаться на нее, если хотите.
$SourceObject | ForEach{
$QuestionsHT = @{}
$_.questions | ForEach{$QuestionsHT.Add($_.question,$_.answer)}
[PSCustomObject]@{
ID = $_.id
Name = $_.name
CompanyName = $_.company.name
'Contracted Protected Data Size (TB)' = $QuestionsHT.'Contracted Protected Data Size (TB)'
'Additional Protected Data Cost: ($/TB/Mo.)' = $QuestionsHT.'Additional Protected Data Cost: ($/TB/Mo.)'
}
}