代码之家  ›  专栏  ›  技术社区  ›  Alex

PowerShell分组在不同版本中的作用不同

  •  0
  • Alex  · 技术社区  · 6 年前

    问题: 我该如何编写它,以便在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 回复  |  直到 6 年前
        1
  •  3
  •   Alex    6 年前

    在PowerShell v5.0中,已对脚本中的psCustomObject Casting进行了改进。

    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}