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

时间:2017-06-14 16:01:15

标签: powershell

当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

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

2 个答案:

答案 0 :(得分:3)

  

输出错误

不,你的功能定义是"错误"。将其更改为:

Function Do-Something([Parameter(ValueFromPipeline)] $str) {
    process { Write-Host $str }
}

一个高级的powershell函数(一个接受管道输入的函数),其中包含3个块:beginprocessend,如下所示:< / p>

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

    begin {}
    process {}
    end {}
}

beginend块将分别称为一次(分别在开头和结尾),而process块将被调用一次每个输入值从中间的管道绑定。

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

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

    end {
        Write-Host $str
    }
}

这就是为什么您看到Write-Host cmdlet仅被调用一次,用于最后一个输入值。

答案 1 :(得分:0)

您也可以尝试

,$a | Do-Something

在这种情况下无需使用过程块。