PowerShell Group Hash Table by Value 这是一个要获取计数的数组
PowerShell Group Hash Table by Value Which is an Array to Get Count
从 SQL 中提取信息,我收集了设备名称、AppownerPrimary、Secondary 和 Tertiary 电子邮件地址。可能有 0 到 3 个电子邮件地址。对于这个问题,我们基本上可以忽略设备名称。
我使用 foreach 循环将此信息放入散列 table:
$DeviceList = @{}
$DeviceLists = (Invoke-Sqlcmd -Serverinstance $ServerInstance -Database $Database -Query "select devicename, appownerprimaryemail, Secondary, Tertiary from dbo.Table order by AppOwnerPrimaryEmail")
foreach ($item in $devicelists)
{
if($item.appownerprimaryemail -and $item.Secondary -and $item.Tertiary)
{
$DeviceList += @{$item.DeviceName = "$($item.AppOwnerPrimaryEmail)", "$($item.Secondary)", "$($item.Tertiary)"}
}
elseif ($item.appownerprimaryemail -and $item.Secondary -and !$item.Tertiary)
{
$DeviceList += @{$item.DeviceName = "$($item.AppOwnerPrimaryEmail)", "$($item.Secondary)"}
}
elseif ($item.appownerprimaryemail -and !$item.Secondary -and !$item.Tertiary)
{
$DeviceList += @{$item.DeviceName = "$($item.AppOwnerPrimaryEmail)"}
}
}
散列 table 最终看起来像这样:
我只需要计算每次出现唯一电子邮件分组的次数。当我开始编写脚本时,只有一封电子邮件,我在 SQL 查询中按电子邮件排序,因此我能够使用 group-object:
[array]$UniqueEmails = $DeviceList.Values | Group-Object
现在可能有 0-3 个,组对象根本不起作用。它似乎将每台设备的所有电子邮件分组在一起。我知道 group-object 不喜欢 hashtables,但我不确定为什么,所以如果你知道为什么会这样,我希望得到解释。但是,这个 post 的要点是我只需要对每个唯一值字符串进行计数。
使用这个例子,我期望这个输出
您可以通过 运行 复制问题:
$Devicelist = @{"Device1" = "Sally.Johnson@Domain.com"; "Device7" = "Sally.Johnson@Domain.com"; "Device8" = "Sally.Johnson@Domain.com"; "Device2" = "Bob.Davis@domain.com", "Jane.Doe@domain.com"; "Device3" = "Bob.Davis@domain.com", "Jane.Doe@domain.com"; "Device4" = "Jane.Doe@domain.com", "Sally.Johnson@domain.com", "Bob.Davis@domain.com"; "Device5" = "Jane.Doe@domain.com", "Sally.Johnson@domain.com", "Bob.Davis@domain.com"; "Device6" = "Jane.Doe@domain.com", "Sally.Johnson@domain.com", "Bob.Davis@domain.com"}
[array]$UniqueEmails = $DeviceList.values | Group-Object
我认为我需要枚举并遍历散列值数组中的每个项目 table,但同时我需要将它们视为一个组,所以我在亏损。非常感谢任何帮助。
如果我不清楚,请告诉我,我会尽力解释得更好。
$devicelist = @{
"Device1" = "Sally.Johnson@Domain.com";
"Device7" = "Sally.Johnson@Domain.com";
"Device8" = "Sally.Johnson@Domain.com";
"Device2" = "Bob.Davis@domain.com", "Jane.Doe@domain.com";
"Device3" = "Bob.Davis@domain.com", "Jane.Doe@domain.com";
"Device4" = "Jane.Doe@domain.com", "Sally.Johnson@domain.com", "Bob.Davis@domain.com";
"Device5" = "Jane.Doe@domain.com", "Sally.Johnson@domain.com", "Bob.Davis@domain.com";
"Device6" = "Jane.Doe@domain.com", "Sally.Johnson@domain.com", "Bob.Davis@domain.com"
}
$uniqueEmails = @{}
# Get all the values in the list, sort them
# and for each, use the value as the key in the unique emails list
# then for that key add 1 every time the key repeats
$devicelist.Values | Sort | % { $uniqueEmails["$_"] += 1 }
Write-Host ($uniqueEmails | Out-String)
# Outputs
Name Value
---- ---- -
Sally.Johnson@Domain.com 3
Jane.Doe@domain.com Sally.J... 3
Bob.Davis@domain.com Jane.D... 2
更新
我在 Posh v1、Posh v2 和 Posh v3 上对此进行了测试,它在 2012 Server R2 上也能正常工作。问题一定出在您的服务器上。 运行 $PSVersionTable.PSVersion 看看你用的是什么版本。
您可以启动任何旧的 Posh 版本:powershell -version 1|2|3。
从 SQL 中提取信息,我收集了设备名称、AppownerPrimary、Secondary 和 Tertiary 电子邮件地址。可能有 0 到 3 个电子邮件地址。对于这个问题,我们基本上可以忽略设备名称。
我使用 foreach 循环将此信息放入散列 table:
$DeviceList = @{}
$DeviceLists = (Invoke-Sqlcmd -Serverinstance $ServerInstance -Database $Database -Query "select devicename, appownerprimaryemail, Secondary, Tertiary from dbo.Table order by AppOwnerPrimaryEmail")
foreach ($item in $devicelists)
{
if($item.appownerprimaryemail -and $item.Secondary -and $item.Tertiary)
{
$DeviceList += @{$item.DeviceName = "$($item.AppOwnerPrimaryEmail)", "$($item.Secondary)", "$($item.Tertiary)"}
}
elseif ($item.appownerprimaryemail -and $item.Secondary -and !$item.Tertiary)
{
$DeviceList += @{$item.DeviceName = "$($item.AppOwnerPrimaryEmail)", "$($item.Secondary)"}
}
elseif ($item.appownerprimaryemail -and !$item.Secondary -and !$item.Tertiary)
{
$DeviceList += @{$item.DeviceName = "$($item.AppOwnerPrimaryEmail)"}
}
}
散列 table 最终看起来像这样:
我只需要计算每次出现唯一电子邮件分组的次数。当我开始编写脚本时,只有一封电子邮件,我在 SQL 查询中按电子邮件排序,因此我能够使用 group-object:
[array]$UniqueEmails = $DeviceList.Values | Group-Object
现在可能有 0-3 个,组对象根本不起作用。它似乎将每台设备的所有电子邮件分组在一起。我知道 group-object 不喜欢 hashtables,但我不确定为什么,所以如果你知道为什么会这样,我希望得到解释。但是,这个 post 的要点是我只需要对每个唯一值字符串进行计数。
使用这个例子,我期望这个输出
您可以通过 运行 复制问题:
$Devicelist = @{"Device1" = "Sally.Johnson@Domain.com"; "Device7" = "Sally.Johnson@Domain.com"; "Device8" = "Sally.Johnson@Domain.com"; "Device2" = "Bob.Davis@domain.com", "Jane.Doe@domain.com"; "Device3" = "Bob.Davis@domain.com", "Jane.Doe@domain.com"; "Device4" = "Jane.Doe@domain.com", "Sally.Johnson@domain.com", "Bob.Davis@domain.com"; "Device5" = "Jane.Doe@domain.com", "Sally.Johnson@domain.com", "Bob.Davis@domain.com"; "Device6" = "Jane.Doe@domain.com", "Sally.Johnson@domain.com", "Bob.Davis@domain.com"}
[array]$UniqueEmails = $DeviceList.values | Group-Object
我认为我需要枚举并遍历散列值数组中的每个项目 table,但同时我需要将它们视为一个组,所以我在亏损。非常感谢任何帮助。
如果我不清楚,请告诉我,我会尽力解释得更好。
$devicelist = @{
"Device1" = "Sally.Johnson@Domain.com";
"Device7" = "Sally.Johnson@Domain.com";
"Device8" = "Sally.Johnson@Domain.com";
"Device2" = "Bob.Davis@domain.com", "Jane.Doe@domain.com";
"Device3" = "Bob.Davis@domain.com", "Jane.Doe@domain.com";
"Device4" = "Jane.Doe@domain.com", "Sally.Johnson@domain.com", "Bob.Davis@domain.com";
"Device5" = "Jane.Doe@domain.com", "Sally.Johnson@domain.com", "Bob.Davis@domain.com";
"Device6" = "Jane.Doe@domain.com", "Sally.Johnson@domain.com", "Bob.Davis@domain.com"
}
$uniqueEmails = @{}
# Get all the values in the list, sort them
# and for each, use the value as the key in the unique emails list
# then for that key add 1 every time the key repeats
$devicelist.Values | Sort | % { $uniqueEmails["$_"] += 1 }
Write-Host ($uniqueEmails | Out-String)
# Outputs
Name Value
---- ---- -
Sally.Johnson@Domain.com 3
Jane.Doe@domain.com Sally.J... 3
Bob.Davis@domain.com Jane.D... 2
更新
我在 Posh v1、Posh v2 和 Posh v3 上对此进行了测试,它在 2012 Server R2 上也能正常工作。问题一定出在您的服务器上。 运行 $PSVersionTable.PSVersion 看看你用的是什么版本。
您可以启动任何旧的 Posh 版本:powershell -version 1|2|3。