PS 在数组通过管道时“展开”数组。
我想使用以下测试脚本来测试它:
$a = @("a", "b", "c")
$a | Write-Host
Run Code Online (Sandbox Code Playgroud)
在这种情况下,$a数组正确展开:
a
b
c
Run Code Online (Sandbox Code Playgroud)
但是,当我使用自己的函数时
Function Do-Something([Parameter(ValueFromPipeline)] $str) {
Write-Host $str
}
$a | Do-Something
Run Code Online (Sandbox Code Playgroud)
输出是:
c
Run Code Online (Sandbox Code Playgroud)
如何在自定义函数中通过管道正确处理数组元素?
输出错误
不,你的函数定义是“错误的”。将其更改为:
Function Do-Something([Parameter(ValueFromPipeline)] $str) {
process { Write-Host $str }
}
Run Code Online (Sandbox Code Playgroud)
高级 powershell 函数(接受管道输入的函数)的主体中有 3 个块:begin、process和end,看起来像这样:
Function Do-Something {
param([Parameter(ValueFromPipeline)] $str)
begin {}
process {}
end {}
}
Run Code Online (Sandbox Code Playgroud)
和块将分别调用一次(分别在开始和结束时),而块将针对从管道之间绑定的每个begin输入值调用一次。endprocess
当您省略begin,process和end声明时,函数的整个主体将被解释为end块,因此您的示例函数将有效地解释为:
Function Do-Something {
param([Parameter(ValueFromPipeline)] $str)
end {
Write-Host $str
}
}
Run Code Online (Sandbox Code Playgroud)
这就是为什么您会看到 cmdletWrite-Host仅针对最后一个输入值调用一次。
| 归档时间: |
|
| 查看次数: |
1072 次 |
| 最近记录: |