PowerShell向hashtable按序添加元素后输出顺序不符如何解决
解决方案
首先明确问题根源:PowerShell 中默认用@{}创建的是普通Hashtable对象,这类结构底层基于哈希索引存储,天生不保证保留元素插入顺序,输出顺序由键的哈希值和存储逻辑决定,所以出现你看到的乱序情况。
你之前尝试的$aDomains = $aDomains | Sort-Object无效的原因是:该操作会把哈希表的键值对拆解为独立的DictionaryEntry对象排序,最终返回的是数组而非哈希表结构,既不符合你后续要使用哈希表的要求,也不会改变原有哈希表的存储顺序。
适配你要求的修正方案
你要求必须使用@{}声明结构,只需要在声明时添加[ordered]修饰符即可,这是PowerShell 3.0及以上版本原生支持的语法:
# 仅修改第一行声明,其余逻辑完全不需要改动 $aDomains = [ordered]@{} $aDomains['a-test.nl'] = @{} $aDomains['b-test.nl'] = @{} $aDomains['c-test.nl'] = @{} $aDomains['d-test.nl'] = @{} $aDomains['e-test.nl'] = @{} $aDomains
修改后输出就会严格和你插入元素的顺序保持一致:
Name Value ---- ----- a-test.nl {} b-test.nl {} c-test.nl {} d-test.nl {} e-test.nl {}
方案说明
[ordered]@{}创建的是OrderedDictionary对象,完全兼容普通哈希表的所有增删改查语法,你后续的脚本逻辑不需要做任何改动,完全满足你要求的用@{}声明结构的规则。- 如果你已经创建了普通哈希表,且需要按自定义顺序(比如字母序)输出,不需要修改原哈希表结构,可以在输出时单独排序:
该操作不会改变原有哈希表的结构,仅输出时按指定规则排序。$aDomains.GetEnumerator() | Sort-Object Name
内容的提问来源于stack exchange,提问作者LPChip
相关产品推荐
相关产品推荐

