在 PowerShell 中使用 Where-Object 命令

Marion Paul Kenneth Mendoza 2023年1月30日 2022年5月16日
  1. PowerShell 中的 Where-Object Cmdlet
  2. 在 PowerShell 中使用脚本块创建筛选条件
  3. 在 PowerShell 中使用参数创建筛选条件
  4. 使用多个条件语句
在 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 中的重要组件。它们在整个脚本语言中的数百个地方使用。脚本块是一个匿名函数,它对代码进行分类并在不同的地方执行它。

示例脚本块:

{$_.StartType -EQ 'Automatic'}

使用 Windows PowerShell 管道,你可以将这些对象通过管道传输到 Where-Object cmdlet 并使用 FilterScript 参数。由于 FilterScript 参数接受一个脚本块,我们可以创建一个条件来检查每个对象的属性是否等于特定值,如下例所示。

示例代码:

Get-Service | Where-Object -FilterScript {$_.StartType -eq 'Automatic'}
注意
许多人将位置参数与 Where-Object cmdlet 一起使用,并且不包含 FilterScript 参数名称。相反,它们单独提供脚本块,如 Where-Object {$_.StartType -eq 'Automatic'} 以实现更快、更简洁的脚本编写方式。

虽然这种类型的语法适用于这种特定场景,但带有花括号 ({}) 的脚本块的概念会使代码的可读性降低,并且对于经验不足的 Windows PowerShell 用户来说更加困难。此可读性问题导致 Windows PowerShell 团队引入参数。

在 PowerShell 中使用参数创建筛选条件

在 Windows PowerShell 3.0 中引入的参数在其编写方式上更加自然。使用与前面相同的示例,让我们使用参数来过滤特定的输出。

示例代码:

Get-Service | Where-Object -Property StartType -eq 'Automatic'

请注意,该命令不使用脚本块,而是将对象属性指定为 Property 参数的参数值。此外,-eq 运算符现在是一个参数,允许你将 Automatic 值传递给它。

以这种方式使用参数现在消除了对脚本块的需要。但是,尽管 Microsoft 已将参数作为一种更简洁的脚本编写方式引入,但我们有充分的理由使用脚本块,我们将在本文的下一部分讨论。

使用多个条件语句

你可以使用运算符(如 -and-or)组合两个或多个条件,以使用脚本块评估它们。但是,我们需要使用称为子表达式的特定 Windows PowerShell 组件来成功评估每个条件。

在 Windows PowerShell 中,我们可以使用子表达式在诸如 Where-Object 之类的过滤语法中运行表达式。我们通过用括号 (()) 将我们运行的任何条件语句括起来来做到这一点。

示例代码:

Get-Process | Where-Object {($_.CPU -gt 2.0) -and ($_.CPU -lt 10)}

示例脚本块:

Handles  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 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