ForEach-Object是一个很强大的管道命令,但是它本质上是一个匿名函数。ForEach-Object也很方便生成一个“原型函数”。倘若你发现ForEach-Object非常实用,你可能会想到要把它转换成一个可以复用的函数。
接下来的语句会使用ForEach-Object来数,从上一条命令中流过的元素个数,它使用的是流模式(而不是先把结果收集到一个变量中那样的耗内存方式)。
Get-Service | ForEach-Object -Begin { $i = 0} -Process { $i++ } -End { $i } To turn this dynamic statement into a function, simply translate it like this:
要想将这些动态的语句转换成一个函数,可以这样改造:
function Get-Count { Begin { $i = 0} Process { $i++ } End { $i } } Get-Service | Get-Count
看到了吧,-Begin, -Process, 和–End参数,可以非常容易地在各个函数的脚本块中添加脚本。你还可以通过$_变量在自己的函数中访问当前流过管道的元素本身。下面的语句只会返回正在运行的服务:
Get-Service | ForEach-Object { if ($_.Status -eq 'Running') { $_ } }
转换成函数:
function Get-RunningService { process { if ($_.Status -eq 'Running') { $_ } } } Get-Service | Get-RunningService
你可能会问为什么我们要将这段流畅的管道脚本转换成一个函数?因为它可以让你的脚本可读性更强。
在特定场景下,管道命令中的ForEach-Object和Where-Object已经尽善尽美。但你可能也已经意识到,在另外一些场景中,函数也可以锦上添花。于是乎,管道转换成可以重复利用的函数也不可或缺。
原文链接:Turning ForEach-Object into a Function
本文链接: https://www.pstips.net/turning-foreach-object-into-a-function.html
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!