PowerShell如何向CSV最后一列写入无引号内容且不覆盖原有数据
问题解决方案
1. 故障原因说明
- 列名不匹配:你原有CSV的表头是
ID、IP,但构造自定义对象时用的属性名是HostName、IP,Export-Csv追加要求字段结构完全一致,你加上了-Force参数就会直接覆盖原有文件,导致旧数据丢失、表头被替换为新对象的属性名。 - 双引号是PowerShell 5.1版本
Export-Csv的默认行为,没有内置开关关闭,你之前的全局字符串替换逻辑不完善,才会出现异常表头。
2. 修正后脚本
if ($inputID -eq $entry.HostName){ "$inputID Ok!" } else{ "$inputID doesn't exist in database!" $title = 'Collector _ HostName' $question = 'Add new ID in csv database?' $choices = '&Yes', '&No' $decision = $Host.UI.PromptForChoice($title, $question, $choices, 1) if ($decision -eq 0) { Write-Host 'confirmed' $ID = Read-Host -Prompt "TypeID" $IP = Read-Host -Prompt "TypeIP" # 修正属性名和原有CSV表头保持一致 $wrapper = New-Object PSObject -Property @{ ID = $ID; IP = $IP } # 先转CSV格式、移除双引号、跳过新增的表头行,再追加到现有文件 $newLine = $wrapper | ConvertTo-Csv -NoTypeInformation $newLine.Replace('"','') | Select-Object -Skip 1 | Add-Content -Path ".\test.csv" -Force Exit } else{ Write-Host 'No' Exit } }
3. 额外说明
- 如果你使用PowerShell 7+版本,
Export-Csv自带-UseQuotes AsNeeded参数,可以直接省略替换逻辑,导出语句直接写为Export-Csv -Append -InputObject $wrapper -Path ".\test.csv" -NoTypeInformation -Force -UseQuotes AsNeeded即可,稳定性更高。 - 不要直接读取整个CSV做全局替换,容易破坏包含逗号、引号的合法内容,上述方案仅处理新增行,不会影响原有数据。
内容的提问来源于stack exchange,提问作者user12428212
相关产品推荐
相关产品推荐

