如何通过管道正确展开数组?

enk*_*tor 2 powershell

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)

如何在自定义函数中通过管道正确处理数组元素?

Mat*_*sen 7

输出错误

不,你的函数定义是“错误的”。将其更改为:

Function Do-Something([Parameter(ValueFromPipeline)] $str) {
    process { Write-Host $str }
}
Run Code Online (Sandbox Code Playgroud)

高级 powershell 函数(接受管道输入的函数)的主体中有 3 个块:beginprocessend,看起来像这样:

Function Do-Something {
    param([Parameter(ValueFromPipeline)] $str)

    begin {}
    process {}
    end {}
}
Run Code Online (Sandbox Code Playgroud)

和块将分别调用一次(分别在开始和结束时),而块将针对从管道之间绑定的每个begin输入调用一次。endprocess

当您省略begin,processend声明时,函数的整个主体将被解释为end块,因此您的示例函数将有效地解释为:

Function Do-Something {
    param([Parameter(ValueFromPipeline)] $str)

    end {
        Write-Host $str
    }
}
Run Code Online (Sandbox Code Playgroud)

这就是为什么您会看到 cmdletWrite-Host仅针对最后一个输入值调用一次。