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

[玩转系统] 如何在 PowerShell 中使用Where-Object cmdlet 进行过滤?

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

如何在 PowerShell 中使用Where-Object cmdlet 进行过滤?


PowerShell 是 Microsoft 开发的一种功能强大的脚本语言和自动化框架,旨在自动管理基于 Windows 的系统和应用程序。 PowerShell 中最有用的 cmdlet 之一是Where-Object,它允许您根据对象的属性过滤和选择特定对象。此 cmdlet 使您能够根据特定条件从集合中筛选出对象,从而更轻松地处理大型数据集并执行复杂的管理任务。

Where-Object cmdlet 是 PowerShell 中的多功能且灵活的工具,允许您使用各种技术来过滤数据。本文将对这些技术进行深入分析,并向您展示如何有效地使用它们来增强您的 PowerShell 技能。我们将介绍 Where-Object 的基本语法和用法、具有多个条件的高级过滤、使用比较运算符、实现通配符和正则表达式以及组合技术以获得精确的结果。

在本指南中,您将学到:

  • 什么是Where-Object,它为什么有用?
  • 通过简单的属性比较来过滤集合
  • 使用 -eq、-ne、-gt、-lt 等运算符。
  • 利用 -like 和 -notlike 进行通配符过滤
  • 使用 -match 和 -notmatch 匹配正则表达式
  • 使用 -and 和 -or 组合多个过滤器
  • 根据对象类型、日期、时间等进行过滤
  • 使用 -ccontains 和 -cmatch 进行区分大小写的过滤
  • 过滤嵌套属性和计算值

了解 PowerShell 中的位置对象过滤技术

Where-Object cmdlet 是 PowerShell 中强大的过滤机制。它允许您根据属性值从集合中选择对象。使用Where-Object,您可以构造返回True或False的条件,以确定是否应沿命令管道传递对象。例如,针对具有数千个用户的 Azure Active Directory 数据库运行 Get-AzureADUser cmdlet 将导致大量输出。过滤数据对于缩小结果范围并专注于您需要的信息至关重要。 Where-Object 可与任何输出对象的 cmdlet 一起使用,例如 Get-Process、Get-Service、Get-ChildItem 等。它消除了手动循环对象的需要!

基本 PowerShellWhere-Object 语法和用法

PowerShellWhere-Object,也称为Where,是一个cmdlet,允许您根据特定对象的属性过滤和选择特定对象。它从 PowerShell Pipeline 获取输入并根据指定的条件对其进行处理。 Where-Object cmdlet 的基本语法如下:


Get-Command | Where-Object {<filter script>}

在此示例中,Get-Command cmdlet 检索所有可用 PowerShell 命令的列表。 Where-Object cmdlet 根据指定的过滤器脚本过滤结果,该脚本括在大括号 ({}) 中。该脚本是定义要应用于数据集的条件的脚本块。例如。,


<Command-That-Produces-Output> | Where-Object { $_.<PropertyName> -<Operator> <Value> }

以下是使用 Where-Object 过滤 Get-Service cmdlet 的结果以仅显示使用 scriptblock 运行的服务的示例:


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

在此示例中,$_ 自动变量表示管道中的当前对象。 -eq 运算符是一个比较运算符,用于检查当前对象的 Status 属性是否等于 'Running'。如果是,则该对象将包含在输出中。

[玩转系统] 如何在 PowerShell 中使用Where-Object cmdlet 进行过滤?

PowerShell 还为其中一些 cmdlet 提供简写别名和语法。对于Where-Object,您可以使用?作为别名:


Get-Service | ? { $_.Status -eq "Running" }

使用带有属性值的Where-Object

您可以使用 -Property-Value 参数指定要过滤的属性和值。例如:当向Where-Object 命令提供单个属性时,该属性的值将被视为布尔表达式。如果值长度不为零,则输出被视为 true。


Get-Service | Where-Object -Property StartType -Eq -Value Disabled

在上面的示例中,我们根据服务的 StartType 属性过滤服务。仅选择 StartType 为“已禁用”的服务。

这是另一个例子:


Get-ChildItem C:\Temp -File | Where Length -gt 1MB

在上面的示例中,要列出“C:\Temp”文件夹中大小大于 1 MB 的文件,您只需使用 Get-ChildItem cmdlet 管道化 where 即可。此语法允许您在不使用脚本块或管道占位符 $_ 的情况下过滤管道。当您需要基于单个属性和单个比较进行过滤时,这种简化的语法特别有用。任何更复杂的事情可能需要使用脚本块。

[玩转系统] 如何在 PowerShell 中使用Where-Object cmdlet 进行过滤?

让我们使用 PowerShell 查找所有扩展名为 .txt 的文件:


Get-ChildItem -Path C:\Docs | Where-Object { $_.Extension -eq ".txt" }

PowerShellWhere-Object:在脚本块中使用多个条件进行过滤

您可以使用 Where-Object PowerShell cmdlet 根据多个条件筛选结果。为此,您可以使用逻辑运算符(例如 -and-or-not 来组合您的条件。以下是使用多个条件来过滤 Get-Process cmdlet 结果的示例:


Get-Process | Where-Object {$_.WorkingSet -gt 10MB -and $_.CPU -gt 300}

在此示例中,我们过滤结果以仅显示工作集大于 10MB 且 CPU 时间大于 300 秒的进程。 -gt 运算符是比较运算符,用于检查指定属性是否大于给定值。

以下是使用脚本块根据服务的状态和启动类型过滤服务的示例:


Get-Service | Where-Object -FilterScript {$_.Status -eq 'Stopped' -and $_.StartType -eq 'manual'}

在此示例中,脚本块评估服务状态是否为“已停止”且启动类型是否为“手动”,仅返回满足这两个条件的服务。

在Where-Object过滤器中使用比较运算符

PowerShell 提供了几个可以在 Where-Object 过滤器中使用的比较运算符:

Eq / Ne

等于/不等于

Gt / Ge

大于/大于或等于

Lt / Le

小于/小于或等于

Like / NotLike

使用通配符匹配模式/不使用通配符匹配模式

Match / NotMatch

使用正则表达式匹配模式/不使用正则表达式匹配模式

Contains / NotContains

包含子串/不包含子串

In / NotIn

用于检查指定值是否存在于一组值中/不存在于一组值中

Ceq / Cne / Cmatch / CNotMatch / Clike / CNotLike / CContains / Cin/Cnotin

区分大小写 等于/不等于/匹配/不匹配/喜欢/不喜欢/包含/在/不在

Cge / Cgt/ Clt / Cle

区分大小写 大于或等于、大于、小于、小于或等于

这些运算符允许您为 Where-Object cmdlet 创建复杂的过滤条件,从而使您能够更好地控制在 PowerShell 中使用的数据。有关 PowerShell 中比较运算符的更多信息请参见此处! PowerShell 比较运算符:基本指南

下面是一个使用 Get-Service cmdlet 的简单示例,它返回计算机服务列表。使用 PowerShell where-object cmdlet,我们可以过滤列表以仅返回具有特定属性的服务,如下所示:


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

在此示例中,我们过滤了列表以返回所有处于“正在运行”状态的服务。 $_.status 属性检查服务是正在运行还是已停止,我们使用 -eq(等于)运算符仅返回那些状态属性设置为“正在运行”的服务。

使用通配符过滤

要启用通配符搜索,请使用 PowerShell 运算符 -like 和 -notlike。


Get-Command | Where-Object { $_.Verb -Like "Get*" }

在这个例子中,我们使用命令来获取命令结构中的所有命令。然后,我们将其通过管道传输到Where-Object cmdlet,在这里我们可以使用脚本块来过滤掉那些动词与“Get”前缀匹配的命令。 $_ 符号代表输入列表中的每个元素,我们可以使用 -Like 运算符来检查动词是否以“Get”开头。

下面的示例获取名称中包含“Chrome”的所有进程:


Get-Process | where {$_.Name -contains "Chrome"} 

使用多个比较运算符进行过滤

假设您的目标是查找过去 10 天内修改过的所有 .jpg 和 .mov 文件(大于 10MB)。您可以使用以下命令:


Get-ChildItem -Path 'C:\Temp' -Include '*.jpg', '*.mov' -Recurse | Where-Object {$_.Length -gt 10MB -and $_.LastWriteTime -gt (Get-Date).AddDays(-10)}

此命令递归搜索 C:\ 驱动器中的 .jpg 和 .mov 文件,并根据大小和修改日期过滤它们。下面是使用带有日期值的 where 子句的另一个示例:


Get-ChildItem | Where-Object {$_.CreationTime -gt [datetime]"01/01/2022"}

区分大小写的匹配

默认情况下,Where-Object 过滤不区分大小写。使用 -cmatch 和 -ccontains 进行区分大小写的比较:


"John","Sarah","JAKE","john" | Where-Object {$_ -ccontains "john"}

这将匹配给定数组中的字符串“john”。对于区分大小写的正则表达式,请使用:


Get-service | Where-Object {$_.Name -cmatch "^[a-z]"}

现在,只有以小写字母开头的名称才会匹配。

过滤嵌套属性

您可以使用点表示法过滤嵌套对象属性。您还可以链接属性:


Get-ADUser -Filter * | Where-Object {$_.Enabled -and $_.Manager.Name -like "*Smith"}

以下是按 EventID 筛选 Windows 事件日志的另一个示例:


# Fetching application log events with EventID 1001
$Events = Get-EventLog -LogName Application | Where-Object { $_.EventID -eq 1001 }

# Displaying the first 5 results
$Events | Select-Object -First 5

PowerShell Select-Object 和Where-Object:组合技术以获得精确结果

在某些情况下,您可能想要过滤数据集,然后选择要显示的过滤对象的特定属性。为此,您可以在 PowerShell 脚本中结合使用 Select-Object cmdlet 和 Where-Object cmdlet。

以下是使用 Select-ObjectWhere-Object 检索正在运行的服务列表并显示其名称和状态的示例:


Get-Service | Where-Object {$_.Status -eq 'Running'} | Select-Object Name, Status

在此示例中,Get-Service cmdlet 检索服务列表,然后由 Where-Object cmdlet 过滤该列表以仅显示正在运行的服务。然后使用 Select-Object cmdlet 选择已过滤对象的 NameStatus 属性。

过滤计算值

Where-Object 过滤器不必是静态值。您可以进行计算。让我们使用 PowerShell 查找特定目录中过去 30 天内创建的文件:


Get-ChildItem -Path C:\Temp -File | 
Where-Object { $_.CreationTime -gt (Get-Date).AddDays(-30) } |
Select-Object Name, CreationTime

在此脚本中,我们计算阈值日期,即距离当前日期 30 天,然后根据 CreationTime 属性使用Where-Object 筛选结果。

如何在PowerShell中使用正则表达式进行过滤?

可以通过使用 -match-notmatch-replace 和其他类似运算符在 Windows PowerShell 中使用正则表达式。您可以在 Where-Object cmdlet 中使用这些运算符来根据模式匹配筛选数据。例如。,


Get-Process | Where-Object {$_.Name -match "^S.*"} | Select Name, ID

在这里,我们使用正则表达式和匹配运算符根据进程名称过滤进程。该脚本仅选择名称以字母“S”开头的进程。

排查 PowerShell 过滤中的常见错误

使用 PowerShell 筛选器时,您可能会遇到一些常见错误。以下是解决这些错误的一些提示:

  1. 比较运算符的使用不正确:确保您针对过滤条件使用正确的比较运算符。例如,使用 -eq 表示相等,使用 -gt 表示大于。
  2. 脚本块中的语法错误:确保您的脚本块包含在大括号 ({}) 中,并且您的条件格式正确。
  3. 属性名称不正确:确保您正在过滤的对象使用正确的属性名称。您可以使用 Get-Member cmdlet 来查看对象的属性。

高效过滤的最佳实践

为了确保高效过滤和最佳性能,必须遵循一些最佳实践:

  1. 在命令中尽早过滤以限制通过管道传递的结果数量。
  2. 尽可能利用 cmdlet 提供的可过滤参数。
  3. 使用特定属性来有效过滤对象。
  4. 利用比较运算符和正则表达式进行灵活的过滤。
  5. 使用“Where”等别名以保持简洁并易于阅读。
  6. 使用逻辑运算符(例如 -and、-or、-xor)组合过滤器以创建更复杂的条件。
  7. 最大限度地减少管道的使用:每次使用管道时,PowerShell 都必须做一些额外的工作,编组对象并在另一端解组它们
  8. 使用 -Filter 参数 如果可用:使用带有 -Filter 参数的 cmdlet,而不是Where-Object。这将从源头进行过滤,从而显着提高性能。例如,获取 ADUser

结论

总之,您可以使用 PowerShell 中的Where-Object 脚本以令人难以置信的准确性和有效性来获取所需的对象。它使用户能够过滤输出并在更大程度上访问特定元素或感兴趣的元素,而不仅仅是显示数组或集合中的所有项目。通过理解语法、比较运算符和高级过滤技术,您可以有效地提取所需的信息。无论是处理文件、服务还是进程,Where-Object cmdlet 都是您在 PowerShell 中进行有效数据筛选的首选解决方案。请记住,熟能生巧。尝试不同的过滤方案,探索高级过滤选项,使用最佳实践,并熟练使用Where-Object cmdlet。快乐的脚本编写!

经常问的问题:

我可以将Where-Object与其他cmdlet一起使用吗?

是的,您可以将Where-Object与其他cmdlet一起使用来有选择地筛选和处理PowerShell管道中的对象。您可以将此多功能 cmdlet 与其他各种 cmdlet 结合起来以完成特定任务。

如何取消Where-Object中的过滤条件?

要否定Where-Object中的过滤条件,可以在条件前使用-not运算符。例如,Where-Object {-not ($_.Status -eq "Running")} 将选择 Status 属性不等于“Running”的对象。

我可以使用Where-Object来过滤数组或集合吗?

是的,您可以使用Where-Object 来过滤对象的数组或集合。您可以通过管道将数组或集合传递给Where-Object,并根据数组或集合中对象的属性指定过滤条件。

如何从 PowerShell 中的对象中删除重复项?

要从 PowerShell 中的对象中删除重复项,您可以使用“Get-Unique” cmdlet。此 cmdlet 从集合中过滤掉重复的对象。

$numbers = 1, 2, 2, 3, 4, 4, 5
$uniqueNumbers = $numbers | Sort-Object | Get-Unique

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

取消回复欢迎 发表评论:

关灯