如何使用PowerShell更新CSV文件中已有条目的指定单元格值
问题分析与解决
你的代码报错的核心问题是没有正确捕获CSV中匹配的对象就尝试直接修改属性。Where({$_.'Object Name' -eq $object})单独使用时没有输入对象源,PowerShell无法定位到要修改的条目。另外还要注意处理Times Flagged的数值类型转换,以及最后将修改后的内容写回CSV文件。
修正后的完整脚本
$listFile = Get-Content "\\File Path\Test List.txt" $csvFile = Import-Csv -Path '\\File Path\Test Report.csv' $Now = [datetime]::Now.ToString("yyyy-MM-dd HH:mm:ss") # 统一日期格式,避免区域差异 foreach($object in $listFile) { # 捕获匹配的CSV条目 $existingEntry = $csvFile | Where-Object { $_.'Object Name' -eq $object } if($existingEntry) { # 更新日期 $existingEntry.'Date Last Flagged' = $Now # 将Times Flagged转为整数后加1,再存回 $existingEntry.'Times Flagged' = [int]$existingEntry.'Times Flagged' + 1 } else { # 添加新条目,初始化Times Flagged为1,日期为当前时间,Notes留空 $newEntry = [PSCustomObject]@{ 'Object Name' = $object 'Times Flagged' = 1 'Date Last Flagged' = $Now 'Notes' = '' } $csvFile += $newEntry } } # 将修改后的内容写回CSV文件,-NoTypeInformation避免添加多余类型信息 $csvFile | Export-Csv -Path '\\File Path\Test Report.csv' -NoTypeInformation -Encoding UTF8
关键修改点说明
- 捕获匹配对象:用
$existingEntry变量接收Where-Object的结果,才能直接定位并修改目标条目的属性,避免原代码中无输入源的无效Where调用。 - 统一日期格式:将
$Now转换为固定格式的字符串(如yyyy-MM-dd HH:mm:ss),避免不同系统区域设置导致的日期显示/解析异常。 - 处理数值类型:
Import-Csv会将所有CSV列解析为字符串,因此需要先把Times Flagged转为[int]类型再执行自增操作,防止出现字符串拼接错误(例如原数值为"2"时,直接加1会变成"21"而非3)。 - 保存修改结果:最后通过
Export-Csv将内存中修改后的$csvFile数组写回原文件,否则所有修改仅停留在内存中,不会持久化到磁盘。
内容的提问来源于stack exchange,提问作者RustyAndroid
相关产品推荐
相关产品推荐

