powershell中哈希表需用export-clixml精确序列化还原,或convertto-json生成跨平台json(还原为pscustomobject);禁用export-csv,因其破坏嵌套结构且无法可靠还原。
powershell 中不能直接将哈希表([hashtable])通过管道“原样”写入文件并保持可还原的结构,因为哈希表是内存中的 .net 对象,不是序列化格式。但你可以用合适的方式**导出为可读、可重载的结构化数据**,关键在于选择正确的序列化命令。
用 Export-Clixml 保存完整哈希表结构
这是最推荐的方法:它把哈希表连同类型、嵌套关系、键值类型全部序列化为 XML,后续可用 Import-Clixml 精确还原为原始 hashtable 对象。
-
导出:
$myHash = @{Name='Alice'; Age=30; Cities=@('Beijing','Shanghai')}; $myHash | Export-Clixml -Path hash.xml -
还原:
$restored = Import-Clixml -Path hash.xml→$restored是完全等价的[hashtable],支持$restored.Name、$restored.Cities[0]等操作
用 ConvertTo-Json + Out-File 生成人类可读的结构化文本
适合跨平台共享或手动查看。JSON 保留嵌套、数组、字符串/数字类型,但会丢失 .NET 类型信息(如 [datetime] 变成字符串),且哈希表键顺序不保证(除非用 [ordered])。
- 导出:
[ordered]@{Status='OK'; Count=42; Tags=@('ps','hash')} | ConvertTo-Json | Out-File config.json - 还原需用
ConvertFrom-Json,结果是PSCustomObject,不是 hashtable;若必须还原为 hashtable,可再转:(Get-Content config.json | ConvertFrom-Json).psobject.properties | ForEach-Object {@{ $_.Name = $_.Value }} | ConvertTo-Hashtable(需自定义辅助函数)
避免用 Export-Csv 或 ConvertTo-Csv 处理哈希表
CSV 是扁平表格格式,只适合“行+列”结构的数据。哈希表的嵌套值、数组、不同数据类型都会被强行转成字符串,丢失结构和语义,无法可靠还原。
- 错误示例:
@{A=1; B=@(2,3)} | Export-Csv data.csv→ 第二列内容变成System.Object[],不可用 - 即使简单哈希表导出后,再用
Import-Csv得到的是PSCustomObject数组,不是 hashtable
小技巧:快速转成有序字典再导出
如果需要保留插入顺序(比如配置项顺序重要),创建时就用 [ordered],再走 JSON 或 Clixml 路径:
$cfg = [ordered]@{ 'DBServer'='sql01'; 'Timeout'=30; 'Features'=@('auth','log') }- 这样导出的 JSON 更易读,还原为
PSCustomObject后属性顺序也一致











