powershell 将条目添加到csv文件会引发错误:不包含名为“op_Addition”的方法

vcirk6k6  于 2023-03-23  发布在  Shell
关注(0)|答案(1)|浏览(173)

我有一个.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

还是不行
完全卡住了。谢谢帮忙。

x4shl7ld

x4shl7ld1#

当您的CSV只有一行时会发生错误,Import-Csv的输出在分配给变量时会被枚举,如果CSV碰巧只有一行,那么变量的类型将是PSObject而不是object[],并且+=在这种情况下会失败,因为PSObject没有定义op_Addition实现。
重现错误的简单方法:

([pscustomobject]@{ foo = 123 }) + ([pscustomobject]@{ foo = 123 })

为了克服这个问题,你可以使用数组子表达式运算符@( ),这样$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

相关问题