Sorting 对值的属性的PowerShell哈希表进行排序

Sorting 对值的属性的PowerShell哈希表进行排序,sorting,powershell,hashtable,Sorting,Powershell,Hashtable,我对哈希表排序有问题。我已经把我的代码分解成了简单的必需品,这样就不会用我的原始脚本压倒任何人 Write-Host "PowerShell Version = " ([string]$psversiontable.psversion) $h = @{} $Value = @{SortOrder=1;v1=1;} $h.Add(1, $Value) $Value = @{SortOrder=2;v1=1;} $h.Add(2, $Value) $Value = @{SortOrder=3;v1

我对哈希表排序有问题。我已经把我的代码分解成了简单的必需品,这样就不会用我的原始脚本压倒任何人

Write-Host "PowerShell Version = " ([string]$psversiontable.psversion) 
$h = @{}
$Value = @{SortOrder=1;v1=1;}
$h.Add(1, $Value)
$Value = @{SortOrder=2;v1=1;}
$h.Add(2, $Value)
$Value = @{SortOrder=3;v1=1;}
$h.Add(3, $Value)
$Value = @{SortOrder=4;v1=1;}
$h.Add(4, $Value)

Write-Host "Ascending"
foreach($f in $h.GetEnumerator() | Sort-Object Value.SortOrder)
{
    Write-Host $f.Value.SortOrder
}

Write-Host "Descending"
foreach($f in $h.GetEnumerator() | Sort-Object Value.SortOrder -descending)
{
    Write-Host $f.Value.SortOrder
}
输出是

PowerShell Version =  3.0
Ascending
2
1
4
3
Descending
2
1
4
3
我确信这只是一个不知道排序对象的正确用法的简单例子。排序在
sort Object Name
上正常工作,因此可能与不知道如何处理
值有关。SortOrder

接受用于排序的属性名或脚本块。由于您试图对属性的属性进行排序,因此需要使用脚本块:

Write-Host "Ascending"
$h.GetEnumerator() | 
    Sort-Object { $_.Value.SortOrder } | 
    ForEach-Object {  Write-Host $_.Value.SortOrder }

Write-Host "Descending"
$h.GetEnumerator() |
    Sort-Object { $_.Value.SortOrder } -Descending |
    ForEach-Object { Write-Host $_.Value.SortOrder }
您可以使用cmdlet进行筛选:


您通常希望将
Where Object
放在任何
Sort Object
cmdlet之前,因为它可以加快排序速度。

我使用哈希表作为频率表,以统计文件名中出现的单词

$words = @{}
get-childitem *.pdf | foreach-object -process {
    $name = $_.name.substring($_.name.indexof("-") + 1, $_.name.indexof(".") - $_.name.indexof("-") - 1)
    $name = $name.replace("_", " ")
    $word = $name.split(" ")[0]
    if ( $words.contains($word) ){
        $words[$word] = $words[$word] + 1 
    }else{
        $words.add($word, 1)
    }
}
$words.getenumerator() | sort-object -property value

最后一行完成了神奇的工作,根据值(频率)对哈希表进行排序。

我已经更新了我的问题,以使用您提到的代码,但我仍然得到相同的输出。nevermind看起来我错过了周期。我将把问题重新编辑回原来的问题。顺便说一句,这可能是一个单独的问题,但有没有简单的方法来>=2或其他一些过滤器。是的,以非常类似的方式与Where对象。在|排序对象之前添加“| Where Object{$|.Value.SortOrder-ge 2}”,不带引号。@ThomasMaierhofer No。用户不想按
名称
属性排序。他想根据传递对象的属性对属性进行排序。这是一个很好的答案。我已经四处闲逛了几个小时,看到了这么多复杂的答案,但这很好用。做得好!我需要在哈希表中进行排序,但将$hashtable={what your write}放进去很简单,效果很好。非常感谢。
$words = @{}
get-childitem *.pdf | foreach-object -process {
    $name = $_.name.substring($_.name.indexof("-") + 1, $_.name.indexof(".") - $_.name.indexof("-") - 1)
    $name = $name.replace("_", " ")
    $word = $name.split(" ")[0]
    if ( $words.contains($word) ){
        $words[$word] = $words[$word] + 1 
    }else{
        $words.add($word, 1)
    }
}
$words.getenumerator() | sort-object -property value