PowerShell for循环写入文件仅首行成功后续行无法追加如何解决
问题核心原因
你所有写入失败的根源是误用了Write-Host命令:
Write-Host的设计目的是直接将内容输出到控制台界面,默认不会将任何数据传入管道,所以你管道后面挂载的Out-File/Add-Content/Export-Csv全程都接收不到输入,自然不会写入内容。- 你看到的控制台有输出只是
Write-Host自己打印的内容,和后续的写入命令完全无关。手动执行时能写入是因为此时你当前会话的$Matches变量刚好保留了最后一次匹配的结果,属于单次巧合,不是代码逻辑正确。 - 额外补充
Export-Csv的使用错误:该命令接收的输入是结构化PowerShell对象,不是直接的字符串,哪怕你把内容传入管道,直接给字符串也无法生成符合预期的CSV文件。
正确实现方案
方案1:使用Out-File/Add-Content写入纯文本
不要用Write-Host,直接构造需要输出的字符串传入管道即可:
$blob = "a 1 b 2 c 3 d 4 e 5" $outfile = 'C:\myfile.txt' $arr = @('1','2','3','4','5') # 先写表头(如果需要) "name,num" | Out-File -Encoding ascii -FilePath $outfile -Force ForEach ($num in $arr) { If ($blob -match "(?<name>[^\s]) (?<num>$([regex]::Escape($num)))") { # 直接构造字符串输出到管道 "$($Matches.name),$($Matches.num)" | Out-File -Encoding ascii -FilePath $outfile -Append -Force } }
方案2:使用Export-Csv生成标准CSV文件
构造自定义对象传给Export-Csv,更符合CSV结构化文件的生成规范:
$blob = "a 1 b 2 c 3 d 4 e 5" $outfile = 'C:\myfile.txt' $arr = @('1','2','3','4','5') $outputList = ForEach ($num in $arr) { If ($blob -match "(?<name>[^\s]) (?<num>$([regex]::Escape($num)))") { # 构造自定义对象 [PSCustomObject]@{ name = $Matches.name num = $Matches.num } } } # 一次性导出所有内容,比循环内逐行追加性能更好 $outputList | Export-Csv -Encoding ASCII -Force -LiteralPath $outfile -NoTypeInformation
内容的提问来源于stack exchange,提问作者skeetastax
相关产品推荐
相关产品推荐

