首页/系统/Windows 运维速查/哈希表 @{} 与有序字典
PowerShell 基础66 条

哈希表 @{} 与有序字典

键值对集合:用于配置与快速查找;@{} 默认无序,需要保持插入顺序用 [ordered]@{}。

Windows 运维速查系统更新于 2026-10-13

哈希表是什么

哈希表在 PowerShell 里写作 @{键=值},用来存配置项或做键值映射与快速查找。默认不保证输出顺序,需要保持插入顺序时用 [ordered]@{ }。它可以直接转成对象或 JSON,是脚本里最常用的数据结构之一。

基本信息

适用平台Windows PowerShell 5.1 与 PowerShell 7
语法$h = @{键=值; 键2=值2}
取值方式$h['键'] 或 $h.键;$h.Keys、$h.Values、$h.Count 可枚举
有序写法[ordered]@{ } 保持插入顺序
键的比较默认不区分大小写,Host 与 host 视为同一个键

典型使用场景

  • 把一批配置项(主机、端口、开关)打包传给函数
  • 做映射表,例如把服务短名映射到中文显示名
  • 动态汇总统计,一边遍历一边累加计数
  • 用 splatting 把哈希表当参数集传给 PowerShell 命令
  • 转成 JSON 或对象后导出给其他程序消费

常用示例

常用示例
$cfg = @{Host='10.0.0.8'; Port=8080; Tls=$true}
$cfg.Port
$cfg['Host']
# 遍历键值对必须用 GetEnumerator
$cfg.GetEnumerator() | ForEach-Object { "$($_.Key)=$($_.Value)" }
# 有序字典,输出顺序固定
$ord = [ordered]@{a=1; b=2; c=3}
# 动态添加与判断键是否存在
$cfg['Timeout'] = 30
$cfg.ContainsKey('Timeout')
# splatting:把哈希表当参数集传给命令
$opt = @{Path='D:\Data'; Filter='*.log'; Recurse=$true}
Get-ChildItem @opt

常用操作写法

操作写法注意
取值$h['键'] 或 $h.键键不存在时返回空值
判断键存在$h.ContainsKey('键')比自己取值再判空更可靠
遍历$h.GetEnumerator()直接 foreach 哈希表会报错
有序字典[ordered]@{ }需要稳定输出顺序时使用
转对象[pscustomobject]$h便于导出 CSV 或 JSON
哈希表键名默认不区分大小写,因此 Host 与 host 是同一个键,赋值会互相覆盖。确实需要区分大小写时改用 .NET 的 Dictionary 构造方式。
重复键会直接抛出异常,让整个脚本中断。从文件或接口读取数据动态拼接哈希表时,要先判重,或改用先判断 ContainsKey 再赋值的方式。
哈希表转 JSON 前建议用 [ordered] 组织键顺序,否则导出文件的字段排列会随版本与插入过程变化;需要稳定格式的配置文件尤其要注意这一点。

易错点

  • 直接对哈希表做 foreach 或管道遍历会报错,必须用 GetEnumerator() 或遍历 Keys
  • 重复键会抛异常中断脚本,拼接配置数据前未去重是常见诱因
  • 默认无序,导出结果顺序不稳定,需要固定顺序却忘了用 [ordered] 会让比对变得困难
  • 键名含空格或特殊字符时不能用点号取值,必须写成方括号加引号的形式
  • 哈希表是引用类型,赋值给另一个变量后指向同一份数据,改动一处会同时影响另一方

数据来源与参考

  • Microsoft Learn:about_Hash_Tables

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌