Powershell Grouping действует по-разному в разных версиях - PullRequest
0 голосов
/ 29 мая 2018

Вопрос: Как мне написать это, чтобы оно дало одинаковый результат в v4 и v5?

Я пытаюсь сгруппировать следующий набор данных по SiteCode.

У меня есть следующий набор данных [Массив хэшей]:

Предположим, что AppointmentId всегда уникален


$groupedDataset = @{}

$dataset = @(
    @{
        Program          = "x"
        AppointmentId    = "1234567891"
        AdminDate        = "x"
        CountryName      = "x"
        SiteCode         = "x1111"
        DateRequested    = "x"
        SubjectID        = "x"
        AccountID        = "x"  
    },
    @{
        Program          = "x"
        AppointmentId    = "1234567892"
        AdminDate        = "x"
        CountryName      = "x"
        SiteCode         = "x1112"
        DateRequested    = "x"
        SubjectID        = "x"
        AccountID        = "x"  
    },
    @{
        Program          = "x"
        AppointmentId    = "1234567893"
        AdminDate        = "x"
        CountryName      = "x"
        SiteCode         = "x1113"
        DateRequested    = "x"
        SubjectID        = "x"
        AccountID        = "x"  
    },
    @{
        Program          = "x"
        AppointmentId    = "1234567894"
        AdminDate        = "x"
        CountryName      = "x"
        SiteCode         = "x1111"
        DateRequested    = "x"
        SubjectID        = "x"
        AccountID        = "x"  
    }
)

Когда я запускаю следующеекод ниже в PS Version: 5.1

$dataset |
    ForEach-Object { [PSCustomObject]$_ } |
    Group-Object -Property SiteCode |
    ForEach-Object {
        $groupedDataset[$_.Name] = $_.Group
    }

Возвращает нужный мне результат:

Name                           Value                                           
----                           -----                                           
x1113                        {@{SiteCode=x1113; Program=x; Appointment...
x1111                        {@{SiteCode=x1111; Program=x; Appointment...
x1112                        {@{SiteCode=x1112; Program=x; Appointment...


Когда я запускаю точный код в PS Version: 4.0он возвращает следующее:
Name                           Value                                           
----                           -----                                           
                               {System.Collections.Hashtable, System.Collect...

1 Ответ

0 голосов
/ 29 мая 2018

В PowerShell v5.0 были сделаны улучшения, например.Кастинг PSCustomObject, который есть в вашем скрипте

ForEach-Object { [PSCustomObject]$_ }

Попробуйте сделать это по-старому, и вместо того, чтобы создавать хеш-таблицу самостоятельно, используйте тот, который возвращен groupby.

$groupedDataset = $dataset |
    ForEach-Object {
         [PSCustomObject]@{
            Program          = $_.Program
            AppointmentId    = $_.AppointmentId
            AdminDate        = $_.AdminDate
            CountryName      = $_.CountryName
            SiteCode         = $_.SiteCode
            DateRequested    = $_.DateRequested
            SubjectID        = $_.SubjectID
            AccountID        = $_.AccountID
        }
    } |
    Group-Object -Property SiteCode -AsHashTable

Thisрезультаты в

$groupedDataset | out-host

Count Name  Group                                                                                                                                                                                        
----- ----- ------                                                                                                                                                                               
2     x1111 {@{Program=x; AppointmentId=1234567891; AdminDate=x; CountryName=x; SiteCode=x1111; DateRequested=x; SubjectID=x; AccountID=x}, @{Program=x; AppointmentId=1234567894; AdminDate=x; CountryN...
1     x1112 {@{Program=x; AppointmentId=1234567892; AdminDate=x; CountryName=x; SiteCode=x1112; DateRequested=x; SubjectID=x; AccountID=x}}                                                                
1     x1113 {@{Program=x; AppointmentId=1234567893; AdminDate=x; CountryName=x; SiteCode=x1113; DateRequested=x; SubjectID=x; AccountID=x}
...