如何在PowerShell中写入数组并以可正常索引操作的形式读回?
解决方案
你的问题核心在于用Out-File保存的是对象的文本展示形式,而非对象本身,所以读回来的是字符串数组,自然没法像操作原自定义对象那样索引和修改属性。要保留对象结构,应该用PowerShell的序列化工具:Export-Clixml和Import-Clixml。
完整实现步骤
1. 初始化/读取日志数组
先检查日志文件是否存在,存在则读取已有日志,不存在则初始化新数组:
$logPath = "C:/R_projects/russ_stuff/Robjects_log.xml" $today = Get-Date -Format "MM/dd/yyyy" # 读取已有日志或初始化 if (Test-Path -Path $logPath) { $Robjects_log = Import-Clixml -Path $logPath } else { # 初始化新日志数组 $Robjects_log = @( [pscustomobject]@{ log_date = $today; log_covid_cases = "Not Checked"; log_allspecimens = "Not Checked"; log_snapshot = "Not Checked"; log_r_script = "No"; log_final_status = "Not Checked"; log_continue_checking = "Yes" } ) }
2. 修改日志属性
现在可以像之前一样正常索引和修改对象属性:
# 找到今日的日志条目 $todayEntry = $Robjects_log | Where-Object { $_.log_date -eq $today } # 如果今日条目不存在,添加新条目(避免重复运行脚本时重复创建) if (-not $todayEntry) { $newEntry = [pscustomobject]@{ log_date = $today; log_covid_cases = "Not Checked"; log_allspecimens = "Not Checked"; log_snapshot = "Not Checked"; log_r_script = "No"; log_final_status = "Not Checked"; log_continue_checking = "Yes" } $Robjects_log += $newEntry $todayEntry = $newEntry } # 修改属性示例 $todayEntry.log_covid_cases = "Checked" $todayEntry.log_r_script = "Yes"
3. 保存日志数组
用Export-Clixml保存,保留对象结构:
$Robjects_log | Export-Clixml -Path $logPath -Force
为什么原来的方法不行?
Format-Table是用来生成可读的文本表格的,会丢失对象的原始结构信息。Out-File只是把输出的文本内容写入文件,不管输入是对象还是字符串,最终存的都是文本。- 用
Get-Content读回来的是字符串数组,每个元素是文本行,不是你定义的pscustomobject,所以没法用.log_date这类属性访问。
额外提示
- 日志文件用
.xml后缀更直观,因为Export-Clixml生成的是XML格式的序列化内容。 -Force参数确保覆盖已有文件,适合每日更新场景。- 用
Where-Object筛选条目比直接索引更可靠,尤其是数组中有多个条目时。
内容的提问来源于stack exchange,提问作者Russ
相关产品推荐
相关产品推荐

