如何将含PowerShell对象表示法(PSON)的文本文件正确转换为CSV
问题根因
之前的代码运行不符合预期,核心原因有三点:
ConvertFrom-StringData返回的是哈希表对象,直接传入Export-Csv时,PowerShell会默认序列化哈希表的内置属性(就是你遇到的IsReadOnly、Keys、Count、Values这类),不会读取哈希表存储的业务键值对。- 逐行追加导出CSV的逻辑没有提前统一全量对象的属性集合,遇到属性顺序不一致的行就会出现列错位。
- 原代码存在语法问题:文件路径没有加字符串引号、
Get-Content拼写错误(写为Get-Contnet),也会导致执行异常。
解决方案
正确处理逻辑是先把所有行的PSON内容全部解析为标准PS自定义对象,收集全量对象后再一次性导出CSV,PowerShell会自动识别所有出现过的属性作为CSV列,自动对齐不存在错位问题。
可直接运行的代码如下:
# 配置输入输出路径 $inputFile = "PsonObjects.txt" $CsvFileName = "CsvOutput.csv" # 初始化集合存储所有解析完成的对象 $objectCollection = [System.Collections.Generic.List[PSObject]]::new() # 逐行解析PSON内容 foreach($line in Get-Content -Path $inputFile){ # 移除每行首尾的@{ }包裹符 $cleanLine = $line.Trim() -replace '^@\{', '' -replace '\}$', '' # 解析键值对为哈希表 $parsedHash = $cleanLine | ConvertFrom-StringData # 哈希表转为自定义PS对象,避免导出时读取哈希表内置属性 $customObject = [PSCustomObject]$parsedHash $objectCollection.Add($customObject) } # 一次性导出为标准CSV文件 $objectCollection | Export-Csv -Path $CsvFileName -NoTypeInformation -Encoding UTF8
代码说明
- 用
[PSCustomObject]强转哈希表后,Export-Csv会直接把哈希表的键作为列名、对应值作为单元格内容,不会再输出哈希表的内置属性。 - 全量对象收集完成后再统一导出,PowerShell会自动扫描所有对象的全部属性,即使某一行属性顺序和其他行不一致,也会按列名自动匹配填充,不会出现列错位。
- 参数
-NoTypeInformation会去掉CSV开头多余的PowerShell类型标识行,-Encoding UTF8避免非英文字符乱码。
注意:如果你的PSON内容中属性值本身包含
;或=特殊字符,需要额外做转义拆分处理,上述代码完全适配你给出的示例数据场景。
内容的提问来源于stack exchange,提问作者Duck
相关产品推荐
相关产品推荐

