PowerShell管道中ForEach-Object疑问:两段代码为何一有效一无效
为什么两段PowerShell代码运行结果不同?
第一段代码能正常工作的原因:
- 先用
$Data = Import-Csv ...把CSV数据加载到变量中,这个变量保存了所有行对象的集合 - 通过管道将
$Data传给ForEach-Object,修改每一行对象的Question和Response属性——因为是直接修改集合内的元素,所以$Data里的内容已经被更新 - 最后把修改后的
$Data管道给Export-Csv,自然能生成正确的文件
第二段代码失效的核心问题:
PowerShell的管道是传递对象的,你的ForEach-Object块里只做了属性修改,但没有把修改后的对象输出到下一个管道环节。Export-Csv接收到的是空内容,所以生成的文件要么是空的,要么只有表头。
修正后的第二段代码:
Import-Csv -Path ./Data1.csv -Delimiter ';' | ForEach-Object { $_.Question = $_.Question -replace "`n", "<br/>" $_.Response = $_.Response -replace "`n", "<br/>" $_ # 关键:把修改后的对象输出到管道 } | Export-Csv -Path "./Data1-bis.csv" -Encoding UTF8
补充说明:PowerShell里的ForEach-Object默认会输出处理后的对象,但如果块内只有赋值操作(无其他输出),就需要显式写出$_来传递对象。直接写$_是最简洁的方式,用Write-Output $_也能达到同样效果。
内容的提问来源于stack exchange,提问作者40tude
相关产品推荐
相关产品推荐

