首页 > 解决方案 > Powershell Grouping 在不同版本中的作用不同

问题描述

问题:如何编写它以便在 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...

标签: powershellgroupingpipingversionscmdlet

解决方案


在 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

这导致

$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}

推荐阅读