PowerShell 第11章:过滤和比较(上)
PowerShell 第11章:过滤和比较(上)
PowerShell 第11章:过滤和比较(上) **左过滤思维 & 比较运算符全解**
- PowerShell 第11章:过滤和比较(上)
- 1️⃣ 为什么几乎所有命令行都要“先过滤”?
- 2️⃣ 左过滤的常用场景与“正确用法”
- 2.1 能用参数就不用管道
- 2.2 不能过滤怎么办?
- 3️⃣ 比较运算符“全家桶”
- 3.1 基础运算符
- 3.2 模式匹配
- 3.3 布尔逻辑
- 4️⃣ 实战:把“左过滤”用在日常命令
- 5️⃣ 课后 3 分钟练习
- 6️⃣ 一图速记
左过滤思维 & 比较运算符全解
目标:学会“在最靠近数据源的地方把不需要的对象挡在门外”,并熟练掌握比较运算符,为后续的
Where-Object
、管道迭代打下基础。
1️⃣ 为什么几乎所有命令行都要“先过滤”?
-
你真正关心的通常不是“所有进程/所有服务”,而是满足某些条件的那一小撮。
-
左过滤(Left Filtering):尽量把过滤条件放在命令行最左边(越靠近数据源越好)。
- 好处:减少无谓的数据传输与计算,网络/服务器更省、命令更快。
- 代价:不同 Cmdlet 的过滤写法不尽相同,需要一点“API 记忆”。
例子
-
直接在数据源筛选(推荐):
# 仅要名字以 DC 开头的计算机对象(Active Directory) Get-ADComputer -Filter "Name -like 'DC*'"
-
不能满足就交给通用过滤器(次选):
# 只要正在运行的服务(Get-Service 不支持直接按 Status 过滤) Get-Service | Where-Object { $_.Status -eq 'Running' }
2️⃣ 左过滤的常用场景与“正确用法”
2.1 能用参数就不用管道
-
某些 Cmdlet 提供了 “过滤参数”,直接过滤最省事:
Get-Service -Name 'e*','s*' # 仅按 Name 支持过滤 Get-ADComputer -Filter "Enabled -eq 'true'" # AD 模块支持属性级过滤
经验:先看完整帮助(
Get-Help <Cmdlet> -Full
),能用参数过滤就不要把所有对象拉回来再Where-Object
。
2.2 不能过滤怎么办?
-
使用
Where-Object
(下篇详谈),或使用括号表达式将另一条命令的输出作为参数值:Get-WmiObject -Class Win32_BIOS -ComputerName (Get-Content .\names.txt)
3️⃣ 比较运算符“全家桶”
规则:运算结果永远是布尔值(
$true/$false
)。字符串比较默认不区分大小写,大小写敏感使用-c*
版本。
3.1 基础运算符
语义 | 不区分大小写 | 区分大小写 |
---|---|---|
相等 / 不等 | -eq / -ne | -ceq / -cne |
大于 / 小于 | -gt / -lt | -cgt / -clt |
大于等于 / 小于等于 | -ge / -le | -cge / -cle |
例子
5 -eq 5 # $true
'Hello' -eq 'hello' # $true(不区分大小写)
(Get-Date) -ge '2012-12-02' # 日期也能比
3.2 模式匹配
语义 | 不区分大小写 | 区分大小写 |
---|---|---|
通配符匹配(支持 * ) | -like / -notlike | -clike / -cnotlike |
正则匹配 | -match / -notmatch | -cmatch / -cnotmatch |
例子
'Hello' -like '*ll*' # $true
'svchost.exe' -match '^svc.*\.exe$' # $true
3.3 布尔逻辑
(5 -gt 10) -and (10 -gt 100) # $false
(5 -gt 10) -or (10 -lt 100) # $true
-not $true # $false# 判断“没有响应”的进程(两种写法)
$_.Responding -eq $false
-not $_.Responding
小技巧:布尔逻辑常与
()
配合,读起来顺、维护性高。
4️⃣ 实战:把“左过滤”用在日常命令
# AD 里只捞需要的(别 filter * 再海量回传)
Get-ADComputer -Filter "OperatingSystem -like '*Server*'"# Get-Service 只能按 Name 过滤;状态筛选放 Where(下篇继续)
Get-Service -Name 's*' # WMI/ CIM 过滤常有自己一套(后续章节详讲)
5️⃣ 课后 3 分钟练习
-
找出名字以
DC
开头的域控:Get-ADComputer -Filter "Name -like 'DC*'"
-
只显示名为
e*
与s*
的服务:Get-Service -Name 'e*','s*'
-
判断字符串是否匹配某正则:
'conhost.exe' -match '^c.*\.exe$'
6️⃣ 一图速记
- 能参数过滤,就别 Where
- 越靠左越好,越靠近数据源越好
- 字符串默认不区分大小写,敏感用
-c*
- 模式匹配:简单用
-like
,复杂用-match
(正则)