在 Windows PowerShell 中,与所需的对象数量相比,通常生成的对象数量以及要传递给管道的对象数量要多得多。可以使用 Format cmdlet 来指定要显示的特定对象的属性,但这并不能帮您解决从显示中删除整个对象的问题。您可能希望在管道结束之前筛选对象,因此只能在最初生成的对象子集上执行操作。

利用 Windows PowerShell 中所含的 Where-Object cmdlet,可以测试管道中的所有对象,并仅将符合特定测试条件的对象通过管道进行传递。没有通过测试的对象将从管道中删除。可以将测试条件设置为 Where-Object FilterScript 参数的值。

使用 Where-Object 执行简单测试

FilterScript 的值为计算结果为 true 或 false 的脚本块(由大括号 {} 括起来的一个或多个 Windows PowerShell 命令)。这些脚本块非常简单,但创建这些脚本块则需要了解 Windows PowerShell 的另一概念,即,比较运算符。比较运算符可比较该运算符两侧的项。比较运算符以“-”字符开头,后跟名称。基本的比较运算符几乎对所有类型的对象适用。更高级的比较运算符只适用于文本或数组。

注意:

默认情况下,在处理文本时,Windows PowerShell 比较运算符不区分大小写。

出于分析方面的考虑,<、> 和 = 等符号不能用作比较运算符。因此,比较运算符改由字母组成。基本的比较运算符如下表所示:

比较运算符 含义 示例(返回 True)

-eq

等于

1 -eq 1

-ne

不等于

1 -ne 2

-lt

小于

1 -lt 2

-le

小于或等于

1 -le 2

-gt

大于

2 -gt 1

-ge

大于或等于

2 -ge 1

-like

类似(用于文本的通配符比较)

"file.doc" -like "f*.do?"

-notlike

不类似(用于文本的通配符比较)

"file.doc" -notlike "p*.doc"

-contains

包含

1,2,3 -contains 1

-notcontains

不包含

1,2,3 -notcontains 4

Where-Object 脚本块使用特殊的变量“$_”来引用管道中的当前对象。此处的示例将演示该变量的工作原理。如果存在一个数字列表,而您只想返回小于 3 的数字,则可通过键入以下命令来使用 Where-Object 筛选数字:

PS> 1,2,3,4 | Where-Object -FilterScript {$_ -lt 3}
1
2

根据对象属性进行筛选

由于 $_ 引用当前的管道对象,因此可访问其属性以进行测试。

作为示例,我们可以查看 WMI 中的 Win32_SystemDriver 类。特定系统中可能存在几百个系统驱动程序,而您可能只对某一组特定的系统驱动程序感兴趣,例如。当前正在运行的那些系统驱动程序。如果使用 Get-Member 查看 Win32_SystemDriver 成员 (Get-WmiObject -Class Win32_SystemDriver | Get-Member -MemberType Property),则将看到的相关属性是 State,并且在驱动程序运行时,它的值为“Running”。键入以下命令可以只选择正在运行的系统驱动程序以进行筛选操作:

Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"}

这仍会生成一个很长的列表。您可能还希望通过测试 StartMode 值来进行筛选,以便只选择设置为自动启动的驱动程序:

PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Auto"}

DisplayName : RAS Asynchronous Media Driver
Name        : AsyncMac
State       : Running
Status      : OK
Started     : True

DisplayName : Audio Stub Driver
Name        : audstub
State       : Running
Status      : OK
Started     : True

由于我们知道哪些驱动程序正在运行,因此这样将产生许多我们不再需要的信息。实际上,此时我们可能需要的信息仅仅是名称和显示名称。以下命令只包括这两个属性,从而得到更简单的输出:

PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Manual"} | Format-Table -Property Name,DisplayName

Name                                    DisplayName
----                                    -----------
AsyncMac                                RAS Asynchronous Media Driver
Fdc                                     Floppy Disk Controller Driver
Flpydisk                                Floppy Disk Driver
Gpc                                     Generic Packet Classifier
IpNat                                   IP Network Address Translator
mouhid                                  Mouse HID Driver
MRxDAV                                  WebDav Client Redirector
mssmbios                                Microsoft System Management BIOS Driver

上述命令中存在两个 Where-Object 元素,而它们可通过使用 -and 逻辑运算符以单个 Where-Object 元素的形式表示出来,如下所示:

Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript { ($_.State -eq "Running") -and ($_.StartMode -eq "Manual") } | Format-Table -Property Name,DisplayName

标准的逻辑运算符如下表所示:

逻辑运算符 含义 示例(返回 True)

-and

逻辑与;两边都为 True 时值为 True

(1 -eq 1) -and (2 -eq 2)

-or

逻辑或;其中一边为 True 时值为 True

(1 -eq 1) -or (1 -eq 2)

-not

逻辑非;对 True 和 False 取反

-not (1 -eq 2)

!

逻辑非;对 True 和 False 取反

!(1 -eq 2)




目录