Powershell,添加项目以散列表

Powershell, add items in order to hashtable

我有以下示例脚本

$aDomains = @{}

$aDomains['a-test.nl'] = @{}
$aDomains['b-test.nl'] = @{}
$aDomains['c-test.nl'] = @{}
$aDomains['d-test.nl'] = @{}
$aDomains['e-test.nl'] = @{}

$aDomains

看起来很直接,但是如果我运行这个脚本,输出是很意外的:

$aDomains


Name                           Value                                                                                
----                           -----                                                                                
e-test.nl                      {}                                                                                   
d-test.nl                      {}                                                                                   
b-test.nl                      {}                                                                                   
a-test.nl                      {}                                                                                   
c-test.nl                      {} 

如何使输出与添加的项目的顺序相匹配?由于脚本中接下来发生的事情,我确实需要在所有实例上使用 @{}。

此外,在脚本中添加这个根本没有效果:

$aDomains = $aDomains | Sort-Object

如您所见,默认情况下哈希表是无序的。从 PowerShell 3.0 开始,您可以对哈希表进行排序,在这种情况下它将保持顺序。

看下面的例子:

$aDomains = [ordered] @{}

$aDomains['e-test.nl'] = @{}
$aDomains['a-test.nl'] = @{}
$aDomains['b-test.nl'] = @{}
$aDomains['c-test.nl'] = @{}
$aDomains['d-test.nl'] = @{}
$aDomains['e-test.nl'] = @{}

$aDomains

Name                           Value                                                                                
----                           -----                                                                                
e-test.nl                      {}                                                                                   
a-test.nl                      {}                                                                                   
b-test.nl                      {}                                                                                   
c-test.nl                      {}                                                                                   
d-test.nl                      {}  

如您所见,e-test.nl在列表中出现了两次,但只在顶部添加了一次,因此它确实符合添加的顺序,不会添加两次。要使其正常工作,请将 [ordered] 标记添加到哈希表分配的开头。

虽然小sidenode。如果你使用.ContainsKey()函数,这个需要改成.Contains()

如果我们将这个对象展开为它的单个元素,那么我们就可以对其进行排序。

$aDomains= $aDomains.GetEnumerator() | Sort-Object -Property Name