如何在 PowerShell 中使用 Where-Object 命令
-
PowerShell 中的
Where-Object
Cmdlet - 在 PowerShell 中使用脚本块创建过滤条件
-
使用
Where-Object
过滤 PowerShell 中的对象 - 在 PowerShell 中使用参数创建过滤条件
- 使用多个条件语句

当您在对象集合中使用 Windows PowerShell 属性时,有时您需要一种方法来过滤出您所需的所有特定内容。因此,了解如何使用 Windows PowerShell 的 Where-Object
Cmdlet 是您 Windows PowerShell 技能中必不可少的技巧。
Where-Object
Cmdlet 是一个有价值的命令,用于过滤对象。在本文中,我们将学习几种构造 Where-Object
命令的方法、它的语法以及多个条件语句的使用。
PowerShell 中的 Where-Object
Cmdlet
Windows PowerShell Where-Object
Cmdlet 的唯一目标是过滤命令的输出并返回我们想要打印的特定信息。
总之,Where-Object
Cmdlet 是一个过滤器。它允许我们构造一个返回 True
或 False
的条件。根据情况的结果,Cmdlet 会返回输出或不返回。
您可以通过两种方式构造该条件:脚本块和参数。
在 PowerShell 中使用脚本块创建过滤条件
脚本块是 Windows PowerShell 中的重要组成部分。它们在脚本语言中的数百个地方使用。脚本块是一个匿名函数,用于对代码进行分类并在各个地方执行。
示例脚本块:
powershellCopy{$_.StartType -EQ 'Automatic'}
使用 Windows PowerShell 管道,您可以将这些对象传递到 Where-Object
Cmdlet,并使用 FilterScript
参数。由于 FilterScript
参数接受脚本块,我们可以创建一个条件来检查每个对象的属性是否等于特定值,如以下示例所示。
示例代码:
powershellCopyGet-Service | Where-Object -FilterScript { $_.StartType -eq 'Automatic' }
Where-Object
Cmdlet 时使用位置参数,而不包括 FilterScript
参数名称。相反,他们只提供脚本块,例如 Where-Object {$_.StartType -eq 'Automatic'}
,以更快、更简洁的方式编写脚本。虽然这种语法在这个特定场景中有效,但带有大括号({}
)的脚本块概念使代码的可读性下降,对于经验较少的 Windows PowerShell 用户来说更难理解。这个可读性问题使 Windows PowerShell 团队引入了参数。
使用 Where-Object
过滤 PowerShell 中的对象
Get-ChildItem
获取指定位置的所有文件和文件夹列表。假设您只想显示目录中的 .csv
文件。
以下示例展示了如何使用 Where-Object
Cmdlet 过滤并选择仅 .csv
文件。
powershellCopyGet-ChildItem | Where-Object { $_.extension -eq ".csv" }
在上面的脚本中,Get-ChildItem
的输出通过管道传递到 Where-Object
Cmdlet。Where-Object
过滤输出,条件是文件扩展名为 .csv
。
输出:
textCopyDirectory: C:\Users\rhntm
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a---- 3/11/2022 7:57 AM 122 books.csv
-a---- 3/8/2022 2:07 PM 780199 house_data.csv
-a---- 3/8/2022 10:38 PM 421 play_tennis.csv
您也可以使用 Where
作为 Where-Object
Cmdlet 的别名。
下面是另一个示例,过滤 ProcessName
属性值的进程列表。它仅显示 ProcessName
为 spotify
的进程。
powershellCopyGet-Process | where { $_.ProcessName -in "spotify" }
输出:
textCopyHandles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------- ------ ----- ----- ------ -- -- -----------
550 31 55036 71256 2.81 1820 3 Spotify
294 21 12328 18144 0.06 13536 3 Spotify
476 64 96012 141208 20.61 13980 3 Spotify
您可以使用 -notin
操作符选择不在对象集合中的值。
例如,下面的示例打印所有 ProcessName
不为 spotify
的进程。
powershellCopyGet-Process | where { $_.ProcessName -notin "spotify" }
通过这种方式,您可以使用 Where-Object
Cmdlet 根据对象的属性值过滤对象集合中的对象。
在 PowerShell 中使用参数创建过滤条件
在 Windows PowerShell 3.0 中引入的参数具有更自然的书写流程。使用之前相同的示例,让我们使用参数过滤特定输出。
示例代码:
powershellCopyGet-Service | Where-Object -Property StartType -EQ 'Automatic'
注意,上面使用的命令中,不是使用脚本块,而是将对象属性指定为 Property
参数的值。此外,-eq
操作符现在是一个参数,允许您将 Automatic
值传递给它。
以这种方式使用参数现在消除了对脚本块的需求。然而,尽管微软引入了参数作为更清晰的脚本方式,但我们有充分的理由使用脚本块,我们将在本文的下一部分讨论。
使用多个条件语句
您可以利用操作符(如 -and
或 -or
)结合两个或多个条件,以使用脚本块评估它们。然而,我们需要使用一个特殊的 Windows PowerShell 组件,称为子表达式,以成功评估每个条件。
在 Windows PowerShell 中,我们可以使用子表达式在过滤语法中运行表达式,例如 Where-Object
。我们通过用括号(()
)将我们运行的条件语句包围起来来做到这一点。
示例代码:
powershellCopyGet-Process | Where-Object { ($_.CPU -gt 2.0) -and ($_.CPU -lt 10) }
示例脚本块:
powershellCopyHandles NPM(K) PM(K) WS(K) CPU(s) Id SI ProcessName
------ - ------ ---- - ---- - ------ -- -- ---------- -
334 21 18972 26384 5.23 3808 0 AnyDesk
635 34 13304 51264 9.56 4140 5 notepad
726 36 12820 51196 4.69 12088 5 notepad
802 46 18356 65088 7.98 10784 5 OneDrive
340 18 6472 26436 3.44 1252 5 RuntimeBroker
698 34 14672 44484 3.63 3284 5 RuntimeBroker
323 19 5732 23432 4.00 11200 5 RuntimeBroker
560 18 6440 27752 4.63 8644 5 sihost
632 31 21524 69972 2.81 6392 5 StartMenuExperienceHost
390 18 9756 30832 3.94 3084 5 svchost
523 24 8768 36312 2.17 6300 5 svchost
524 17 6416 21036 4.42 10932 5 SynTPEnh
525 22 15336 38904 3.41 2192 5 TextInputHost
Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.
LinkedIn