PowerShell基础教程(15)——从管道中删除对象 (Where-Object)

PowerShell基础教程(15)——从管道中删除对象 (Where-Object)             <o:p></o:p>

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

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

使用 Where-Object 执行简单测试<o:p></o:p>

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>

根据对象属性进行筛选<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>

 

你可能感兴趣的:(windows,Microsoft,F#,脚本,powershell)