使用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
中吗?
答案 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)