向CSV文件添加条目报错:PSObject不含'op_Addition'方法
问题分析与解决方案
错误根源
当你的CSV日志文件只有表头(无数据行)或者仅有1条数据记录时,Import-Csv返回的是单个PSObject对象,而非数组。此时执行$Log += $NewLogEntry会报错,因为单个PSObject没有定义加法操作(op_Addition方法)。只有当CSV有2条及以上记录时,Import-Csv才会返回数组,+=才能正常工作——这就是报错随机的原因。
另外你尝试的$Log2 = Log+= $NewLogEntry是语法错误,正确写法应为$Log2 = $Log += $NewLogEntry,但这无法解决根本问题。
解决方案
方案1:强制将导入结果转为数组
通过@()运算符,确保$Log始终是数组类型,无论CSV中有多少条记录:
# 强制转为数组,避免单个对象的情况 $Log = @(Import-Csv -Path "C:\Temp\Logging.csv") $NewLogEntry = [PSCustomObject]@{ LastWriteTime = $Path.LastWriteTime.ToString('hh:mm ddd MMM dd yy') BackupFile = $path MountedDrive = $Drive.ToUpper() } $Log += $NewLogEntry # 导出时去掉默认的类型信息行(#TYPE...) $Log | ConvertTo-Csv -NoTypeInformation | Set-Content -Path "C:\Temp\Logging.csv" -Force
方案2:直接追加单行到CSV(更高效)
如果日志文件较大,读取整个文件再写入会影响性能,还可能出现文件锁问题。可以直接将新记录转为CSV格式后追加到文件:
$NewLogEntry = [PSCustomObject]@{ LastWriteTime = $Path.LastWriteTime.ToString('hh:mm ddd MMM dd yy') BackupFile = $path MountedDrive = $Drive.ToUpper() } # 如果文件不存在,先写入表头 if (-not (Test-Path "C:\Temp\Logging.csv")) { $NewLogEntry | ConvertTo-Csv -NoTypeInformation | Set-Content -Path "C:\Temp\Logging.csv" -Force } else { # 仅追加新记录的CSV行(跳过表头) $NewLogEntry | ConvertTo-Csv -NoTypeInformation | Select-Object -Skip 1 | Add-Content -Path "C:\Temp\Logging.csv" -Force }
内容的提问来源于stack exchange,提问作者gaberiel__
相关产品推荐
相关产品推荐

