Это не красиво, и это может быть не очень производительно с большим количеством данных, но вот один из способов сделать это ...
Во-первых, давайте создадим несколько примеров данных:
$data = @(
(new-object PSObject -Property ([ordered] @{
"BatchName" = "Batch1"
"TargetDatabase" = "Database1"
"Status" = "Completed"
})),
(new-object PSObject -Property ([ordered] @{
"BatchName" = "Batch1"
"TargetDatabase" = "Database1"
"Status" = "In Progress"
})),
(new-object PSObject -Property ([ordered] @{
"BatchName" = "Batch2"
"TargetDatabase" = "Database2"
"Status" = "Completed"
}))
)
сейчас, обработайте его:
Set-Variable -Name "optNum" -Option AllScope -Value 1
$results = @( $data | group-object BatchName, TargetDatabase ) `
| select-object @{Name="Option";Expression={$optNum; $optNum++}},
@{Name="BatchName";Expression={$_.Group[0].BatchName}},
@{Name="TargetDatabase";Expression={$_.Group[0].TargetDatabase}},
@{Name="Status";Expression={$_.Group.Status -join ", "}} `
| sort-object -Property BatchName
и покажите результат:
PS> $results
Option BatchName TargetDatabase Status
------ --------- -------------- ------
1 Batch1 Database1 Completed, In Progress
2 Batch2 Database2 Completed
Что он делает, это группировка , чтобы выбрать уникальные комбинации BatchName и DatabaseNameа затем для получения результатов он выбирает BatchName и DatabaseName из первого элемента в каждой группе и объединяет все свойства Status из элементов в этой группе (вы также можете обработать состояния в выражении состояния, если вы хотите, например, отсортировать, отфильтруйте или удалите их в каждой группе).
Обратите внимание, что я переместил ваш исходный sort-object BatchName
в конец конвейера. Нет смысла сортировать, скажем, 1000 объектов только для того, чтобы выбросить половину из них - вы могли бы также отсортировать в конце.
И я мог только заставить ваш счетчик «Option» работать, используя Set-Variable, чтобы сделатьAllScope
, поскольку $optNum++
не увеличивал переменную должным образом, когда я использовал $optNum = 1
для ее инициализации.