将PowerShell中的ForEach-Object转换成函数


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
请尊重原作者和编辑的辛勤劳动,欢迎转载,并注明出处!

关于 Mooser Lee

我是一个Powershell的爱好者,创建了PowerShell中文博客,热衷于Powershell技术的搜集和分享。本站部分内容来源于互联网,不足之处敬请谅解,并欢迎您批评指正。

发表评论

电子邮件地址不会被公开。 必填项已用*标注