我有一个像这样的 .csv
文件:
"LastWriteTime","BackupFile","MountedDrive"
"07:07 Fri Mar 03 23","c:\temp\xxx01-01.mrimg","A"
"08:07 Fri Mar 03 23","c:\temp\xxx01-02.mrimg","B"
"09:07 Fri Mar 03 23","c:\temp\xxx01-03.mrimg","C"
它是一个日志文件,我有一个函数,每次执行某些操作时都会向其中添加一个条目,这是该函数的片段:
$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
$Log | ConvertTo-Csv | Set-Content -Path "C:\Temp\Logging.csv" -Force
这行$Log += $NewLogEntry
似乎随机抛出一个错误,它有时会起作用,但大多数会抛出一个错误:
Method invocation failed because [System.Management.Automation.PSObject] does not contain a method named 'op_Addition'.
At line:24 char:12
+ $Var = $Log += $NewLogEntry
+ ~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (op_Addition:String) [], RuntimeException
查找它,我发现答案表明它与 $log
不被覆盖有关,所以我尝试:
$Log2 = Log+= $NewLogEntry
$Log2 | ConvertTo-Csv | Set-Content -Path "C:\Temp\Logging.csv" -Force
仍然失败。
完全卡住了。感谢您的帮助。
最佳答案
当您的 CSV 只有一行时,就会发生错误,如果 CSV 碰巧只有一行,则在分配给变量时会枚举 Import-Csv
的输出行,那么变量的类型将是 PSObject
而不是 object[]
,并且 +=
在这种情况下会失败,因为 PSObject
没有定义 op_Addition
实现。
重现错误的简单方法:
([pscustomobject]@{ foo = 123 }) + ([pscustomobject]@{ foo = 123 })
要克服这个问题,您可以使用 Array subexpression operator @( )
所以 $Log
始终是一个 object[]
:
$Log = @(Import-Csv -Path "C:\Temp\Logging.csv")
但是,更简单的方法是简单地使用 -Append
,这样就无需导入 CSV:
# No `Import-Csv` needed
[PSCustomObject]@{
LastWriteTime = $Path.LastWriteTime.ToString('hh:mm ddd MMM dd yy')
BackupFile = $path
MountedDrive = $Drive.ToUpper()
} | Export-Csv "C:\Temp\Logging.csv" -NoTypeInformation -Append
关于powershell - 向 csv 文件添加条目会引发错误 :does not contain a method named 'op_Addition' ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/75655512/