powershell - 向 csv 文件添加条目会引发错误 :does not contain a method named 'op_Addition'

标签 powershell

我有一个像这样的 .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/

相关文章:

PowerShell 读取文件修改日期并检查它是否在过去 X 小时内被修改

security - 哈希表漏洞(属性覆盖)?

powershell - 检测以相同名称运行的进程数

Facebook 通过 PowerShell 实现自动化?

c# - C# 中的 OpenSSL.exe s_client 等价物

powershell - 无法在二进制模块中创建 Powershell 别名

powershell - 将参数安全地传递给使用 Puppet 执行的 Powershell 脚本?

powershell - 从 Select-Object 语句连接两个属性

c# - Azure powershell 无法识别 "azure"

powershell - 如何添加在 Visual Studio 2013 脚手架中使用的新脚手架?