哈希表是什么
哈希表在 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] 组织键顺序,否则导出文件的字段排列会随版本与插入过程变化;需要稳定格式的配置文件尤其要注意这一点。