在 Windows PowerShell 中,与所需的对象数量相比,通常生成的对象数量以及要传递给管道的对象数量要多得多。可以使用 Format cmdlet 来指定要显示的特定对象的属性,但这并不能帮您解决从显示中删除整个对象的问题。您可能希望在管道结束之前筛选对象,因此只能在最初生成的对象子集上执行操作。
利用 Windows PowerShell 中的 Where-Object cmdlet,可以测试管道中的所有对象,并将符合特定测试条件的对象通过管道进行传递。没有通过测试的对象将从管道中删除。可以将测试条件设置为 Where-ObjectFilterScript 参数的值。
FilterScript 的值为计算结果为 True 或 False 的脚本块(由大括号 {} 括住的一个或多个 Windows PowerShell 命令)。这些脚本块非常简单,但创建这些脚本块则需要了解 Windows PowerShell 的另一概念,即,比较运算符。比较运算符可比较该运算符两侧的项。比较运算符以“-”字符开头,后跟名称。基本的比较运算符几乎对所有类型的对象适用。更高级的比较运算符只适用于文本或数组。
<!----><!----><!---->请注意: <o:p></o:p>
默认情况下,在处理文本时,Windows PowerShell 比较运算符不区分大小写。 <o:p></o:p>
出于分析方面的考虑,诸如 <、> 和 = 之类的符号不能用作比较运算符。因此,比较运算符改由字母组成。基本的比较运算符如下表所示:
<o:p> </o:p>
比较运算符<o:p></o:p> |
含义<o:p></o:p> |
示例(返回 True)<o:p></o:p> |
-eq<o:p></o:p> |
等于<o:p></o:p> |
1 -eq 1<o:p></o:p> |
-ne<o:p></o:p> |
不等于<o:p></o:p> |
1 -ne 2<o:p></o:p> |
-lt<o:p></o:p> |
小于<o:p></o:p> |
1 -lt 2<o:p></o:p> |
-le<o:p></o:p> |
小于或等于<o:p></o:p> |
1 -le 2<o:p></o:p> |
-gt<o:p></o:p> |
大于<o:p></o:p> |
2 -gt 1<o:p></o:p> |
-ge<o:p></o:p> |
大于或等于<o:p></o:p> |
2 -ge 1<o:p></o:p> |
-like<o:p></o:p> |
类似(用于文本的通配符比较)<o:p></o:p> |
"file.doc" -like "f*.do?"<o:p></o:p> |
-notlike<o:p></o:p> |
不类似(用于文本的通配符比较)<o:p></o:p> |
"file.doc" -notlike "p*.doc"<o:p></o:p> |
-contains<o:p></o:p> |
包含<o:p></o:p> |
1,2,3 -contains 1<o:p></o:p> |
-notcontains<o:p></o:p> |
不包含<o:p></o:p> |
1,2,3 -notcontains 4<o:p></o:p> |
<o:p> </o:p>
Where-Object 脚本块使用特殊的变量“$_”来引用管道中的当前对象。此处的示例将演示该变量的工作原理。如果存在一个数字列表,而您只需返回小于 3 的数字,则可通过键入以下命令来使用 Where-Object 筛选数字:
PS> 1,2,3,4 | Where-Object -FilterScript {$_ -lt 3}<o:p></o:p> 1<o:p></o:p> 2<o:p></o:p> |
<o:p> </o:p>
由于 $_ 引用当前的管道对象,因此可访问其属性以进行测试。
作为示例,我们可以查看 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"}<o:p></o:p> |
<o:p> </o:p>
这仍会生成一个很长的列表。您可能还希望通过测试 StartMode 值来进行筛选,以便只选择设置为自动启动的驱动程序:
PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Auto"}<o:p></o:p> <o:p> </o:p> DisplayName :RAS Asynchronous Media Driver<o:p></o:p> Name :AsyncMac<o:p></o:p> State :Running<o:p></o:p> Status :OK<o:p></o:p> Started :True<o:p></o:p> <o:p> </o:p> DisplayName :Audio Stub Driver<o:p></o:p> Name :audstub<o:p></o:p> State :Running<o:p></o:p> Status :OK<o:p></o:p> Started :True<o:p></o:p> |
<o:p> </o:p>
由于我们已了解哪些驱动程序正在运行,因此这将产生许多我们不再需要的信息。实际上,此时我们可能需要的信息仅仅是名称和显示名称。以下命令只包括这两个属性,从而得到更简单的输出:
PS> Get-WmiObject -Class Win32_SystemDriver | Where-Object -FilterScript {$_.State -eq "Running"} | Where-Object -FilterScript {$_.StartMode -eq "Manual"} | Format-Table -Property Name,DisplayName<o:p></o:p> <o:p> </o:p> Name DisplayName<o:p></o:p> ---- -----------<o:p></o:p> AsyncMac RAS Asynchronous Media Driver<o:p></o:p> Fdc Floppy Disk Controller Driver<o:p></o:p> Flpydisk Floppy Disk Driver<o:p></o:p> Gpc Generic Packet Classifier<o:p></o:p> IpNat IP Network Address Translator<o:p></o:p> mouhid Mouse HID Driver<o:p></o:p> MRxDAV WebDav Client Redirector<o:p></o:p> mssmbios Microsoft System Management BIOS Driver<o:p></o:p> |
<o:p> </o:p>
上述命令中存在两个 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<o:p></o:p> |
<o:p> </o:p>
标准的逻辑运算符如下表所示:
<o:p> </o:p>
逻辑运算符<o:p></o:p> |
含义<o:p></o:p> |
示例(返回 True)<o:p></o:p> |
-and<o:p></o:p> |
逻辑与;两边都为 True 时值为 True<o:p></o:p> |
(1 -eq 1) -and (2 -eq 2)<o:p></o:p> |
-or<o:p></o:p> |
逻辑或;其中一边为 True 时值为 True <o:p></o:p> |
(1 -eq 1) -or (1 -eq 2)<o:p></o:p> |
-not<o:p></o:p> |
逻辑非;对 True 和 False 取反<o:p></o:p> |
-not (1 -eq 2)<o:p></o:p> |
!<o:p></o:p> |
逻辑非;对 True 和 False 取反<o:p></o:p> |
!(1 -eq 2)<o:p></o:p> |