当PS通过管道时“展开”数组 我想使用以下测试脚本测试它:
$a = @("a", "b", "c")
$a | Write-Host
在这种情况下,$a
数组正确展开:
a
b
c
但是,当我使用自己的功能时
Function Do-Something([Parameter(ValueFromPipeline)] $str) {
Write-Host $str
}
$a | Do-Something
输出是:
c
如何在自定义函数中通过管道正确处理数组元素?
答案 0 :(得分:3)
输出错误
不,你的功能定义是"错误"。将其更改为:
Function Do-Something([Parameter(ValueFromPipeline)] $str) {
process { Write-Host $str }
}
一个高级的powershell函数(一个接受管道输入的函数),其中包含3个块:begin
,process
和end
,如下所示:< / p>
Function Do-Something {
param([Parameter(ValueFromPipeline)] $str)
begin {}
process {}
end {}
}
begin
和end
块将分别称为一次(分别在开头和结尾),而process
块将被调用一次每个输入值从中间的管道绑定。
当您省略begin
,process
和end
声明时,函数的整个主体将被解释为end
块,因此您的示例函数是有效的解释为:
Function Do-Something {
param([Parameter(ValueFromPipeline)] $str)
end {
Write-Host $str
}
}
这就是为什么您看到Write-Host
cmdlet仅被调用一次,用于最后一个输入值。
答案 1 :(得分:0)
您也可以尝试
,$a | Do-Something
在这种情况下无需使用过程块。