You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.01 14:31:00