我有一个这样的哈希数组:
$weeklyStats[$RecipientName][$weekNr][$total]
它是在一个循环中创建的:
$weeklyStats = @{}
$weekNr = get-date -UFormat %V
ForEach ($RecipientName in $MailTraffic.keys)
{
$weeklyStats[$RecipientName] = @{}
$weeklyStats[$RecipientName][$weekNr] = @{}
$weeklyStats[$RecipientName][$weekNr]['Total'] = 0
$weeklyStats[$RecipientName][$weekNr]['Sent'] = 0
$weeklyStats[$RecipientName][$weekNr]['Received'] = 0
foreach($item in $MailTraffic[$RecipientName].keys)
{
weeklyStats[$RecipientName][$weekNr]['Total'] =+ 1
if $MailTraffic[$RecipientName]['transaction'] == "Sent"
{
$weeklyStats[$RecipientName][$weekNr]['Sent'] =+ 1
}
else
{
$weeklyStats[$RecipientName][$weekNr]['Received'] =+ 1
}
}
}
我不知道如何在Powershell中"转储"变量,但以下是json:中的内容
{
"mike": {
"11": {
"Total": 411,
"Sent": 21,
"Received":390,
}
},
"peter": {
"11": {
"Total": 751,
"Sent": 51,
"Received":700,
}
},
"frank": {
"11": {
"Total": 620,
"Sent": 20,
"Received":600,
}
},
}
我想按$total的降序打印出键和值。如果哈希表只有一级深度,我只能找到如何做到这一点的例子。
预期输出为:
Name Total Received Sent
----- ----- ----- -----
peter 751 700 51
frank 620 600 20
mike 411 390 21
通过引用内部哈希表的Keys
属性进行排序,然后分配给新的[ordered]
字典:
$sorted = [ordered]@{}
$stats.GetEnumerator() |Sort-Object {
# Sort by first key from each inner hashtable
$_.Value.Keys |Select -First 1
} -Descending |ForEach-Object {
# re-assign to our ordered dictionary
$sorted[$_.Key] = $_.Value
}
$sorted
现在包含您的新排序词典
大多数PowerShell cmdlet都用于处理(流!([PSObject]
类型(包括[PScustomerObject]
类型(列表的输入和输出
(要了解差异,请参见PSObject、Hashtable和PSCustomObject之间的差异(
嵌套哈希表很难在PowerShell中维护和处理(另请参阅:PowerShell多维数组(,因为PowerShell针对流式传输进行了优化,而流式传输对于级联对象来说相当困难,因此我建议您将嵌套哈希表转换为(相当平坦的([PScustomerObject]
列表,类似于:
$PSStats =
ForEach ($name in $Stats.Keys) {
ForEach ($weekNr in $_.Keys) {
ForEach ($total in $_.Keys) {
[pscustomobject]@{name = $name; weekNr = $weekNr; total = $total}
}
}
}
一旦您将其转换为PSCustomObject
列表,您就可以轻松地对其进行排序并显示结果:
$PSStats | Sort-Object Total
我只需要从哈希表中创建一个自定义对象,然后根据Title
属性进行排序:
# Creation of $mailtraffic
$mailtraffic = @{'Mike' = @{'Total' = 411; 'Sent' = 21; 'Received' = 390};'Peter' = @{'Total' = 751; 'Sent' = 51; 'Received' = 700};'Frank' = @{'Total' = 620; 'Sent' = 20; 'Received' = 600}}
# Sorting Code
$mailtraffic.GetEnumerator() |
Select @{n='Name';e={$_.Key}},@{n='Total';e={$_.Value.Total}},@{n='Received';e={$_.Value.Received}},@{n='Sent';e={$_.Value.Sent}} |
Sort Total -Descending