PowerShell 技能连载 - Where-Object 和 .Where()

从 PowerShell 4 开始,当您不想使用管道的时候,可以使用 Where()ForEach() 方法来代替 Where-ObjectForEach-Object

所以如果您已经将所有数据加载到一个变量中,那么非流式操作会更高效:

1
2
3
4
5
6
$Services = Get-Service

# streaming
$Services | Where-Object { $_.Status -eq 'Running' }
# non-streaming
$Services.Where{ $_.Status -eq 'Running' }

要节约资源,最有效地方法仍然是使用流式管道,而不是用变量:

1
Get-Service | Where-Object { $_.Status -eq 'Running' }

请注意 Where-Object.Where() 使用不同的数组类型,所以它们的输出技术上是不同的:

1
2
3
4
5
PS C:\> (1..19 |  Where-Object { $_ -gt 10 }).GetType().FullName
System.Object[]

PS C:\> ((1..19).Where{ $_ -gt 10 }).GetType().FullName
System.Collections.ObjectModel.Collection`1[[System.Management.Automation.PSObject, System.Management.Automation, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35]]

本文国际来源:Where-Object and .Where()

评论