PowerShell中保存与读取PSCustomObject数组到文件的实现方法
PowerShell持久化Get-ChildItem输出对象实现方法
你要的对象存读功能不需要自己写复杂逻辑,PowerShell原生提供了两种成熟的序列化方案,都可以完整还原对象结构支持后续遍历、属性读取:
方案1:CliXml格式(保真度最高,优先推荐)
这是PowerShell专门设计的对象持久化格式,内置cmdlet直接支持,能最大限度保留Get-ChildItem返回的FileInfo/DirectoryInfo对象的属性、类型信息,还原后和原对象使用体验几乎一致。
对应你的存读逻辑实现如下:
$gci = Get-ChildItem -Recurse # 保存到文件(等价于save_file) # -Depth 手动指定序列化深度,默认值2会丢失深层属性,设为10足够覆盖文件对象所有常用属性 $gci | Export-CliXml -Path "list.gci" -Depth 10 # 从文件读取还原(等价于load_file) $gci2 = Import-CliXml -Path "list.gci" # 后续遍历、属性读取完全兼容 foreach ($item in $gci2) { $fullname = $item.FullName $creationTime = $item.CreationTime Write-Host $fullname }
注意:你示例代码中循环内写
$gci2.fullname会返回整个数组所有项的FullName集合,应该用当前遍历项$item.FullName;另外Get-ChildItem返回对象的创建时间属性名是CreationTime,不是CreationDate,不要写错。
方案2:JSON格式(纯文本可读,跨工具兼容)
如果需要保存的文件可以用普通文本编辑器打开查看,或者要跨工具传递数据,可以用JSON序列化,缺点是还原后是纯[PSCustomObject]结构,不会保留原文件对象的方法,仅支持属性读取。
实现代码:
$gci = Get-ChildItem -Recurse # 保存为JSON文件 $gci | ConvertTo-Json -Depth 10 | Out-File -Path "list.gci" -Encoding utf8 # 读取还原 $gci2 = Get-Content -Path "list.gci" -Raw -Encoding utf8 | ConvertFrom-Json
避坑提示
- 不要用
Export-Csv做这类复杂对象的持久化,CSV是扁平二维结构,会把所有嵌套属性转成类型名字符串,完全无法还原原始结构。 - 所有序列化操作必须手动指定
-Depth参数,PowerShell默认序列化深度只有2,嵌套层级超过2的属性会被序列化为null,导致数据丢失。 - CliXml格式文件是PowerShell专属,不同PowerShell版本之间兼容性很好,7.x版本导出的文件5.1版本也可以正常读取。
内容的提问来源于stack exchange,提问作者Bimo
相关产品推荐
相关产品推荐

