如何在 PowerShell 中使用 Where-Object 命令

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

当您在对象集合中使用 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 是一个过滤器。它允许我们构造一个返回 TrueFalse 的条件。根据情况的结果,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 属性值的进程列表。它仅显示 ProcessNamespotify 的进程。

 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
Enjoying our tutorials? Subscribe to DelftStack on YouTube to support us in creating more high-quality video guides. Subscribe
Marion Paul Kenneth Mendoza avatar Marion Paul Kenneth Mendoza avatar

Marion specializes in anything Microsoft-related and always tries to work and apply code in an IT infrastructure.

LinkedIn

相关文章 - PowerShell Statement