Get-ChildItem&使用$ _。basename中的路径导出-Csv

时间:2018-02-19 16:19:59

标签: powershell

我需要在导出时从文件名中添加一个补丁,该补丁是从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")

也有相同的结果。

1 个答案:

答案 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]原因是在通过管道发送任何对象之前,直接传递的值被绑定到它们的参数变量