Powershell - 从哈希表集合中获取不同的值

Powershell - Getting distinct values from a collection of hash tables

我对所有内容都使用 powershell 5.1 版。我的问题的背景是我正在使用 powershell DSC 为各种节点创建 web 应用程序和应用程序池。对于除最后 2 台服务器之外的每台服务器,每个 Web 应用程序都有一个独特的应用程序池,因此一切正常。在最后两台服务器上,由于内存问题,有几台服务器共享应用程序池。我将对给定站点的名称引用与服务帐户一起存储在节点数据中,然后在非节点数据中,我放置了更详细的详细信息(rt 版本、池名称等)。我可以在不使用的情况下加入这些数据连接对象库。我给了将重复使用的应用程序池冗余名称,以便理想情况下我可以在排序后使用“Get-Unique”或将 -Unique 传递给排序操作。哈希表的集合似乎忽略了这一点(可能是因为它们本质上是唯一的,所以我是个傻瓜)。我已经讨论了很多次,现在转换类型,使用添加成员等。我的代码很糟糕,所以最新版本在下面。感谢您的任何有效输入。

$a = @()
        $JoinedObject = Foreach ($SiteName in $Node.Sites)
        {
            $ConfigurationData.Sites | Where-Object {$_.Name -eq $SiteName[0]} | Foreach-Object{
                $test =$_ | Select-object $_.PoolConfigName, $_.PoolName, $_.PoolRtVer | Sort-Object -Unique
                }
                
                
                foreach($i in $test)
                {
                    if ($a -notcontains $i)
                    {
                    #write-host $i #, $i.GetType()
                    $a = $a + $i
                    }
                }
                #write-host $a
                
            #Write-host $test, $test.Gettype()
            
            #write-host $a[0] | select -Unique
            #write-host $_.PoolName
            #write-host $_.PoolRtVer
        }

输出仍然包含重复项

@{ApEssRo=; EssWebServicesRO=; v4.0=} @{ApEssW=; EssWebServices=; v4.0=} @{ApEssRo=; EssWebServicesRO=; v4.0=} @{ApEssRo=; EssWebServicesRO=; v4.0=} @{ApEssRo=; EssWebServicesRO=; v4.0=} @{ApEssRo=; EssWeb
ServicesRO=; v4.0=} @{ApEssRo=; EssWebServicesRO=; v4.0=} @{ApEssRo=; EssWebServicesRO=; v4.0=} @{ApEssRo=; EssWebServicesRO=; v4.0=} @{ApEssRo=; EssWebServicesRO=; v4.0=} @{ApEssRo=; EssWebServicesRO=; v4
.0=} @{ApEssRo=; EssWebServicesRO=; v4.0=} @{ApEssRo=; EssWebServicesRO=; v4.0=} @{ApEssRo=; EssWebServicesRO=; v4.0=} @{ApEssRo=; EssWebServicesRO=; v4.0=} @{ApEssW=; EssWebServices=; v4.0=} @{ApEssOhr1=;
 EssWebServicesOhr1=; v4.0=}

我想我不想把它作为一个悬而未决的问题,因为我想出了一个“解决方案”(意思是,在大量 trial/error 之后不是很好)。

我迭代将第一个循环绑定到一个完整集合中,然后迭代它以轻松地将其转换为 PSCustomObject access/manipulate。然后迭代它以通过 属性 名称获取不同的值。然后迭代它以使用这些显式值。

我希望那些更精通 PowerShell 基础知识的人不要因为摇头而受到鞭打。

        $FullSiteCollection = @(@())
        $PoolCollection = @(@())
        $JoinedObject = Foreach ($SiteName in $Node.Sites)
        {
            $ConfigurationData.Sites | Where-Object {$_.Name -eq $SiteName[0]} | Foreach-Object{
                #$test =$_ | Select-object $_.PoolConfigName, $_.PoolName, $_.PoolRtVer | Sort-Object -Unique
                $test =$_ | select @{ Label="RunAs";Expression={$SiteName[1]}},@{ Label="PoolName";Expression={$_.PoolName}},@{ Label="PoolConfigName";Expression={$_.PoolConfigName}},@{ Label="PoolRtVer";Expression={$_.PoolRtVer}}
                }
        $FullSiteCollection+=$test
        }
        foreach($i in $FullSiteCollection)
        {
            $i = [pscustomobject]@{
                        RunAs=$i.RunAs
                        PoolName=$i.PoolName
                        PoolConfigName=$i.PoolConfigName
                        PoolRtVer=$i.PoolRtVer
                    }
            if ($PoolCollection.PoolName -notcontains $i.Poolname)
            {$PoolCollection = $PoolCollection + $i}
        }
        foreach($Pool in $PoolCollection)
        {
           #xWebAppPool $Pool.PoolConfigName (yadda yadda)