[玩转系统] 如何在 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 还为其中一些 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 查找所有扩展名为 .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
过滤器中使用的比较运算符:
等于/不等于
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-Object
和 Where-Object
检索正在运行的服务列表并显示其名称和状态的示例:
Get-Service | Where-Object {$_.Status -eq 'Running'} | Select-Object Name, Status
在此示例中,Get-Service
cmdlet 检索服务列表,然后由 Where-Object
cmdlet 过滤该列表以仅显示正在运行的服务。然后使用 Select-Object
cmdlet 选择已过滤对象的 Name
和 Status
属性。
过滤计算值
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 筛选器时,您可能会遇到一些常见错误。以下是解决这些错误的一些提示:
- 比较运算符的使用不正确:确保您针对过滤条件使用正确的比较运算符。例如,使用
-eq
表示相等,使用-gt
表示大于。 - 脚本块中的语法错误:确保您的脚本块包含在大括号 (
{}
) 中,并且您的条件格式正确。 - 属性名称不正确:确保您正在过滤的对象使用正确的属性名称。您可以使用
Get-Member
cmdlet 来查看对象的属性。
高效过滤的最佳实践
为了确保高效过滤和最佳性能,必须遵循一些最佳实践:
- 在命令中尽早过滤以限制通过管道传递的结果数量。
- 尽可能利用 cmdlet 提供的可过滤参数。
- 使用特定属性来有效过滤对象。
- 利用比较运算符和正则表达式进行灵活的过滤。
- 使用“Where”等别名以保持简洁并易于阅读。
- 使用逻辑运算符(例如 -and、-or、-xor)组合过滤器以创建更复杂的条件。
- 最大限度地减少管道的使用:每次使用管道时,PowerShell 都必须做一些额外的工作,编组对象并在另一端解组它们
- 使用 -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
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag