使用ForEach-Object的函数

时间:2014-05-28 04:09:35

标签: powershell powershell-v2.0

使用ForEach-Object功能时,有没有办法提供function而不是code block

这可以让我简化这个:

@(1, 2, 3, 4) | % { Add-One $_ }

到此,或类似:

@(1, 2, 3, 4) | % Add-One

为了完整性,这里是Add-One函数的当前定义

function Add-One($Number) {
    return $Number + 1
}

使用process编写一个函数可以很容易地执行类似的操作,如下所示:

@(1, 2, 3, 4) | Add-One

但是,这意味着您必须为每个函数重新实现循环和ValueFromPipeline,而不是重用已经提供的ForEach-Object。那么简而言之,有一种方法可以使用ForEach-Object的标量函数来避免将其包装在Code Block中吗?

1 个答案:

答案 0 :(得分:10)

当然,你可以像这样使用一个脚本块:

PS> $sb = { process { $_ + 1 }}
PS> 1..4 | % $sb
2
3
4
5

但也许更直接的方法是创建一个过滤器:

filter Add-One { $_ + 1 }
1..4 | Add-One

您也可以使用一种功能,例如:

function Add-One {process {$_ + 1}}
1..4 | Add-One

过滤器基本上是一个带有隐含过程块的函数。高级函数方法如下所示:

function Add-One {
    [CmdletBinding()]
    param(
        [Parameter(ValueFromPipeline)]
        [int[]]
        $Number
    )
    process {
        foreach ($n in $Number) {$n + 1}
    }
 }
1..4 | Add-One
Add-One (1..4)