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
我有以下示例脚本
$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