Powershell访问先前管道中的变量

时间:2018-02-17 17:37:27

标签: powershell

我创建了以下命令,用于合并与文件夹内的过滤器匹配的所有csv文件,并将其输出到outfile中。

$mainPath="C:\\users\\myuser\\temp";
$mergeFilter="myfile.csv";
$outFile = "C:\\users\\myuser\temp\test.csv";
Get-ChildItem $mainPath -Recurse -Include $mergeFilter |
    Select-Object -ExpandProperty FullName |
    Import-Csv -Delimiter ';' |
    Select-Object *,@{Name='Date'; Expression={"$dummyvariable"}}; |
    Export-Csv $outFile -NoTypeInformation -Delimiter ';'

我的问题是,我想在使用名为$ dummyvariable的变量合并某些CSV时添加一个额外的列,但我不知道我必须在哪里初始化它才能获得Expression = {“的值。 “}。如果我之前在管道中声明它不起作用(我需要在管道上更高的位置来获取目录名称)

你知道如何声明这个变量并在以“Select-Object”开头的管道上恢复吗?

提前致谢

最诚挚的问候。

2 个答案:

答案 0 :(得分:2)

我认为您正在寻找 -PipelineVariable-pv)常用参数(PSv4 +),它将给定cmdlet的当前输出对象存储在变量中可以在以后的管道段中的脚本块中引用

这是一个简化的例子:

# Create sample input file.
@'
foo;bar
1;2
'@ > file.csv

Get-Item file.csv -pv fileObj | Select-Object -ExpandProperty FullName | 
  Import-Csv -Delimiter ';' | Select-Object *, @{ n='Date'; e={ $fileObj.LastWriteTime } }

以上结果如下:

foo bar Date              
--- --- ----              
1   2   2/17/18 4:17:25 PM

也就是说,-pv fileObj使Get-Item将其当前输出对象存储在变量$fileObj中,最后一个管道段能够在属性定义脚本块中引用它。

答案 1 :(得分:0)

您应该能够使用ForEach-Object指定$dummyvariable,而不会影响管道的其他元素。

$mainPath="C:\\users\\myuser\\temp";
$mergeFilter="myfile.csv";
$outFile = "C:\\users\\myuser\temp\test.csv";
Get-ChildItem $mainPath -Recurse -Include $mergeFilter |
    Select-Object -ExpandProperty FullName |
    Import-Csv -Delimiter ';' |
    ForEachObject {$dummyvariable = "..."} |
    Select-Object *,@{Name='Date'; Expression={"$dummyvariable"}}; |
    Export-Csv $outFile -NoTypeInformation -Delimiter ';'

这是未经测试的。您可能需要通过执行以下操作指定需要将属性传递到下一个管道:

ForEachObject {$dummyvariable = "...";$_} |

我的方法是按照vonPryz的建议解决问题。使调试和维护更容易。