将值添加或更改为CSV

时间:2019-05-02 12:09:41

标签: powershell csv

我在PowerShell中导入CSV,并希望通过添加或更改内容再次导出。

这就是我导入它的方式:

$csv = Import-Csv $csvFile -Delimiter ";"

CSV具有三个列,即用户名,密码和密钥。

当我想更改一行时:

$csv = $csv | ? { $_.UserName -eq $UserName } | % {
    $_.pass = $PasName
    $_.key  = $KeyName
} 
$csv | Export-Csv $csvFile -Delimiter ";" -Force -NoTypeInformation

它留下了没有任何内容的CSV文件。为什么会这样?

此外,当我只想添加一行时

$csv += [PSCustomObject]@{
    UserName = $UserName
    pass     = $PasName
    key      = $KeyName
}
$csv | Export-Csv $csvFile -Delimiter ";" -Force -NoTypeInformation

它返回错误,说:

  

Fehler beim Aufrufen der Methode,请使用[System.Management.Automation.PSObject] Keine Methode mit dem Namen“ op_Addition”。
  在Zeile:44 Zeichen:13

有人知道为什么会这样吗?

我知道我可以像这样添加内容

$xy = "{0};{1};{2}" -f xy,xy,xy
Add-Content -Path $csvFile -Value $xy

但是我宁愿导出全新的CSV

1 个答案:

答案 0 :(得分:1)

您的第二个代码段将空结果,因为您将循环输出分配回了变量$csv。但是,循环不会产生任何输出,因此您可以通过这样做有效地清除变量。要解决此问题,只需删除分配。循环就地更新变量。

$csv | Where-Object {
    $_.UserName -eq $UserName
} | ForEach-Object {
    $_.pass = $PasName
    $_.key  = $KeyName
} 
$csv | Export-Csv $csvFile -Delimiter ";" -Force -NoTypeInformation

如果$csv不是数组(例如,当它为空或仅包含一条记录时),则可能会出现来自第三代码段的错误。您可以通过在导入时将其强制为数组来减轻这种情况:

$csv = @(Import-Csv $csvFile -Delimiter ";")

此外,要将新记录附加到CSV上,将其实际添加到CSV更加干净和直接:

[PSCustomObject]@{
    UserName = $UserName
    pass     = $PasName
    key      = $KeyName
} | Export-Csv $csvFile -Delimiter ";" -Force -NoTypeInformation -Append