使用ForEach-Object的函数

Dan*_*tle 2 powershell powershell-2.0

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

这将使我能够简化:

@(1, 2, 3, 4) | % { Add-One $_ }
Run Code Online (Sandbox Code Playgroud)

对此,或类似:

@(1, 2, 3, 4) | % Add-One
Run Code Online (Sandbox Code Playgroud)

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

function Add-One($Number) {
    return $Number + 1
}
Run Code Online (Sandbox Code Playgroud)

编写一个函数process来做类似的事情很容易,如下所示:

@(1, 2, 3, 4) | Add-One
Run Code Online (Sandbox Code Playgroud)

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

Kei*_*ill 10

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

PS> $sb = { process { $_ + 1 }}
PS> 1..4 | % $sb
2
3
4
5
Run Code Online (Sandbox Code Playgroud)

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

filter Add-One { $_ + 1 }
1..4 | Add-One
Run Code Online (Sandbox Code Playgroud)

您还可以使用以下功能:

function Add-One {process {$_ + 1}}
1..4 | Add-One
Run Code Online (Sandbox Code Playgroud)

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

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

  • 对于像我这样搜索`filter`文档的人来说,它位于`about_Functions`中:"过滤器是一种在管道中的每个对象上运行的函数.过滤器类似于一个函数及其在Process块中的所有语句过滤器的语法如下:`filter [<scope:>] <name> {<statement list>}`" (2认同)