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)
我对所有内容都使用 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)