当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 如何使用 PowerShellWhere-Object 来过滤所有内容

作者:精品下载站 日期:2024-12-14 13:04:12 浏览:15 分类:玩电脑

如何使用 PowerShellWhere-Object 来过滤所有内容


当您使用对象集合中的 PowerShell 属性值时,有时您需要一种方法来过滤掉所有不需要的内容。了解如何使用 PowerShell Where-Object cmdlet 是 PowerShell 工具箱中一项重要技能。

Where-Object cmdlet 是过滤对象的便捷方法。在本教程中,您将学习构建 Where-Object 命令的不同方法、它的可用参数、语法,以及如何像专业人士一样使用多个条件!

先决条件

本文只有一个先决条件。您应该对 PowerShell 命令和语法有一定的了解。

本文中的所有示例都将基于 PowerShell 当前的稳定版本(撰写本文时为 7.1.0)。但只要您拥有 Windows PowerShell 4.0 及更高版本,这些命令的工作方式就相同。

了解 PowerShellWhere-Object 如何工作

PowerShell Where-Object cmdlet 的唯一目标是过滤命令返回的输出,仅返回您想要查看的信息。

简而言之,Where-Object cmdlet 是一个过滤器;就是这样。它允许您构造一个返回 True 或 False 的条件。根据该条件的结果,cmdlet 返回或不返回输出。

您可以通过以下两种方式之一来制定该条件:使用脚本块的“旧”方式和使用参数或比较语句的“新”方式。

使用脚本块创建过滤条件

脚本块是 PowerShell 中的关键组件。脚本块在整个语言的数百个地方使用。脚本块是一个匿名函数。这是一种划分代码并在不同位置执行它的方法。您可以通过脚本块为 Where-Object 构建过滤器。

要将脚本块用作过滤器,您可以使用 FilterScript 参数。此参数允许您创建脚本块并将其传递给随后执行的 FilterScript 参数。

如果脚本块返回布尔值 False 或 null 变量以外的值,则将其视为 True。如果不是,则被认为是 False。

例如,假设您需要查找当前启动类型为“自动”的所有 Windows 服务。您首先使用 Get-Service 收集所有当前服务。然后,Get-Service 返回许多具有各种属性的不同服务对象。

然后,您可以使用 PowerShell 管道将这些对象通过管道传输到 Where-Object cmdlet 并使用 FilterScript 参数。由于 FilterScript 参数接受脚本块,因此您可以创建一个条件来检查每个对象的 StartType 属性是否等于 Automatic,例如以下。

{$_.StartType -EQ 'Automatic'}

获得过滤脚本块后,您可以将该脚本块提供给 FilterScript 参数。然后,Where-Object 将为管道中传入的每个对象执行该脚本块,并评估每个 StartType 属性。如果属性等于AutomaticWhere-Object 将传递该对象。如果没有,该物体就会被丢弃。

您可以在下面看到此方法的一个简单示例。

Get-Service | Where-Object -FilterScript {$_.StartType -EQ 'Automatic'}

[玩转系统] 如何使用 PowerShellWhere-Object 来过滤所有内容

许多人将位置参数与 Where-Object cmdlet 结合使用,但不包含 FilterScript 参数名称。相反,它们只是单独提供脚本块,例如 Where-Object {$_.StartType -eq 'Automatic'}

虽然这种类型的构造适用于这种特定的场景。带有大括号的脚本块甚至管道变量 $_ 的概念使得代码的可读性较差,并且对于经验不足的 PowerShell 用户来说更加困难。这种可读性问题是导致 PowerShell 团队引入参数或比较语句的原因。

比较声明

Windows PowerShell 3.0 中引入的比较语句的构造方式更加自然。使用与前面的示例相同的场景,让我们使用比较语句构造来查找具有自动启动类型的所有 Windows 服务:

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

请注意,上面的命令没有使用脚本块,而是将对象属性指定为 Property 参数的参数值。 eq 运算符现在也是一个参数,允许您将Automatic 的值传递给它。

现在以这种方式使用参数完全消除了对脚本块的需要。

在定义更复杂的过滤条件时,脚本块是更好的选择。 Property 参数可能并不总是最佳选择。如果使用脚本块,请记住使用注释来记录您的代码!

在下一节中,您将了解可用的比较运算符类型,这些类型可与 Where-Object 一起使用来过滤所有内容。

过滤基础知识

Where-Object 使用参数,使用通用比较运算符过滤对象集合。让我们深入了解它们如何工作的一些示例。

收容操作员

包含运算符在处理集合时非常有用。包含运算符允许您定义集合是否包含项目的条件。

举个例子,假设您想要过滤集合中的特定属性值。您可以使用包含运算符。

在 PowerShell 中,您会发现一些不同的包含运算符:

  • -contains/-ccontains - 过滤包含属性值的集合。
  • -notcontains/-cnotcontains - 过滤不包含属性值的集合。
  • -in/-cin - 值位于集合中,如果找到匹配则返回属性值。
  • -notin/-cnotin - 值不在集合中,如果没有属性则为 null/$false价值。

为了区分大小写,请使用以 -c[operator] 开头的包含运算符

相关:通过示例了解 PowerShell 比较运算符

假设您想要检查 BITS Windows 服务的状态。您可以使用 contains 参数(运算符)将 BITS 的值传递给它,如下所示。

Get-Service | Where-Object -Property Name -Contains 'BITS'

以下是您期望看到的内容:

[玩转系统] 如何使用 PowerShellWhere-Object 来过滤所有内容

永远记住要向左过滤!前面的示例相当于运行 Get-Service -ServiceName 'BITS'

也许您想更进一步并找到所有状态不是正在运行StartType的服务这是一个名为Manual的单个字符串(或者可以是一个数组)中。使用下面的脚本块,该命令使用 FilterScript 参数来传递根据这两个条件进行评估的脚本块。

相关:回归基础:了解 PowerShell 对象

Get-Service |
	Where-Object {($_.Status -notcontains 'Running') -and ($_.StartType -in 'Manual')}

当您运行上述命令时,您只会看到已停止且 StartTypeManual 的服务。

[玩转系统] 如何使用 PowerShellWhere-Object 来过滤所有内容

使用包含运算符进行过滤对于包含许多属性值的集合效果很好。考虑到 Get-Service 返回的属性数量,当您组合包含运算符和逻辑运算符时,可以更轻松地过滤所有这些属性。

匹配运算符

与将包含运算符与 Where-Object 结合使用类似,您也可以使用数学运算符。匹配运算符允许您匹配字符串内部的字符串。例如,'foofoo' -like '*foo*' 返回 True 或 'foofoo' -match 'foo' 返回 True。匹配运算符匹配字符串的字符串。

在 PowerShell 中,您可以在 Where-Object 中使用一些不同的匹配运算符。

  • -like/-clike - 字符串与通配符模式匹配。
  • -notlike/-cnotlike - 字符串与通配符模式不匹配。
  • -match/-cmatch - 字符串与正则表达式模式匹配。
  • -notmatch/-cnotmatch - 字符串与正则表达式模式不匹配

为了区分大小写,请使用以 -c[operator] 开头的匹配运算符

其形式与包含运算符几乎相同,您可以使用匹配运算符,如下所示。以下示例查找 DisplayName 属性值中包含 Windows 的所有服务。

Get-Service | Where-Object { $_.DisplayName -match 'Windows'}

[玩转系统] 如何使用 PowerShellWhere-Object 来过滤所有内容

相关:PowerShell 和 Regex 入门

您还可以使用 like 运算符来使用常见的匹配技术,例如使用通配符 (*) 来匹配任何字符,或者使用 ? 来匹配单个字符。

Get-Service | Where-Object {($_.Name -like 'Win*')}

现在,结果将被过滤为仅包含“Win”作为前三个字符的服务名称:

[玩转系统] 如何使用 PowerShellWhere-Object 来过滤所有内容

使用通配符意味着您不必知道服务的全名。只需要字符串中的几个字母即可。这些运算符还可以与逻辑运算符结合使用,以进一步增强过滤功能。

等式运算符

与如何使用包含和比较运算符类似,您还可以将相等运算符与 Where-Object 一起使用。当需要比较数值时,相等运算符非常有用。

例如,1 -eq 1 为 True,而 1 -gt 2 为 False。 PowerShell 有许多不同的等式运算符,您可以将它们用作 Where-Object 参数或条件脚本块内部。

  • -eq/-ceq - 值等于指定值。
  • -ne/-cne - 值不等于指定值。
  • -gt/-cgt - 值大于指定值。
  • -ge/-cge - 值大于或等于指定值。
  • -lt/-clt - 值小于指定值。
  • -le/-cle - 值小于或等于指定值。

例如,也许您想查找占用 CPU 2% 到 10% 的所有正在运行的进程。对于 Get-ProcessWhere-Object PowerShell cmdlet 来说这不是问题。

使用脚本块,您可以使用 and 运算符将两个条件组合在一起,该运算符将对它们进行评估。如果它们都返回 True,则 Where-Object 返回通过管道传递的流程对象。如果至少有一个条件返回 False,则 Where-Object 会删除该对象。

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

以下是您期望看到的内容:

[玩转系统] 如何使用 PowerShellWhere-Object 来过滤所有内容

使用 Where-Object 等式运算符进行过滤将帮助您构建系统报告或比较值。

下一步

现在您已经了解了如何使用 PowerShell Where-Object cmdlet 来过滤所有内容的更多信息,您还能做什么?尝试一些更复杂的过滤任务,在集合上使用多个条件和运算符来过滤属性值并根据您的喜好格式化输出。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯