我需要在导出时从文件名中添加一个补丁,该补丁是从Get-Childitem
生成的。
Get-ChildItem 'C:\temp\*.txt' | foreach-Object {
*some magic here*
} | export-csv -NoTypeInformation -Force -Encoding UTF8 ($_.basename + ".txt")
工作正常,但现在我想为生成的txt文件添加路径。
我将代码更改为
| export-csv -NoTypeInformation -Force -Encoding UTF8 -path "c:\temp\csv_temp\"($_.basename + ".csv")
失败了。我也尝试过:
| export-csv -NoTypeInformation -Force -Encoding UTF8 ("c:\temp\test\"+ $_.basename + ".txt")
也有相同的结果。
答案 0 :(得分:2)
($_.basename + ".txt")
电话中的Export-Csv
无法工作,因为直接用作参数值时未定义$_
,在脚本块之外。
(除非您事先已明确地将.basename
属性明确分配给$_
- 您不应该这样做 - $_
未定义,所以($_.basename + ".txt")
评估结果为".txt"
,您有效地输出到名为.txt
的文件。)
您通常无法使用$_
- 甚至是使用-PipelineVariable
/ -pv
公共参数从早期管道阶段传递的变量 - 作为直接参数值,在脚本块之外。 [1]
因此,我建议您重构您的命令,如下所示(为方便起见,使用PSv4 + -pv
/ -PipelineVariable
常用参数,但它很容易使解决方案适应PSv3 - ):
Get-ChildItem 'C:\temp\*.txt' -pv fileObj | ForEach-Object {
*some magic here* |
Export-Csv -NoTypeInformation -Force -Encoding UTF8 ($fileObj.basename + ".txt")
}
通过将Export-Csv
调用移动到ForEach-Object
脚本块,您可以使用由$fileObj
创建的-pv fileObj
变量,表示手头的输入文件。< / p>
虽然输入文件也反映在脚本块内的$_
中,但嵌入管道的上下文中$_
重新定义,所以-pv fileObj
是一种方便的方法来创建一个变量,该变量将外部管道的输入对象称为$fileObj
;或者,您可以在脚本块的开头执行$fileObj = $_
,这使得解决方案也可以在PSv3中运行。
然后是替代的目标文件路径参数:
# Using an expandable string with an *embedded* expression:
# Note the $(...) surrounding the expression
"c:\temp\csv_temp\$($fileObj.basename + ".csv")"
# Using an expression (string concatenation):
("c:\temp\test\" + $fileObj.basename + ".txt")
[1]原因是在通过管道发送任何对象之前,直接传递的值被绑定到它们的参数变量。