Shell提供了两种方式缩小结果集,他们都归结为过滤。
第一种方式:尝试指定cmdlet命令只检索指定的内容。
第二种方式:采用迭代的方式,通过第一个Cmdlet 获得所有结果,并使用第二个Cmdlet过滤掉不想要的东西。
第一种方式我们称之为尽可能提前过滤。这让Cmdlet更加容易知道你想要的是什么。例如,使用get-service, 你可以告诉它你想要的服务名称:
Get-Service -name e*, *s*
如果你想让Get-Service只返回正在运行的服务,而不考虑他们的服务名称,,该Cmdlet就无法做到这一点。因为他们有提供相关的参数来指定该信息。
同理,如果你是用微软的活动目录模块,素有的Get- Cmdlets 命令都提供了 -filter参数。通过 -filter *,你可以获取所有的对象,但是这样做会增加域控制器牙里。我们可以指定类似下面清晰的条件说明;
Get-ADComputer -Filter "Name -like 'DC'"
上述技巧的优势在于该Cmdlet只检索匹配的对象,我们称之为左过滤技术。
左过滤
z左过滤意味着尽可能把过滤条件放置在左侧或者靠近命令行的开始部分, 越早过滤掉你不需要的对象,就越能减轻其他cmdlet命令的工作,并且减少不必要的心思通过网络传输到你的电脑。
但是左过滤技术的缺点是每个cmdlet都可以通过自己的方式指定过滤,并且每个cmdlet都会有不同的过滤方式。所以就需要我们去熟悉很多cmdlets不同的过滤方式。
当然,我们也会碰到无法通过一个cmdlet就可以完成你所需的所有过滤时,你可以使用一个叫做where-object(alias: where) 的核心PowerShell Cmdlet命令。这是一个通用的语法,当需要检索的时候,使用它过滤任何类型的对象,并把它放入管道。
为了使用where,我们需要学会如何告诉shell如何过滤你想要的信息,这其中就包括了对比操作。
过滤对象的管道
例如: Get-Service | where {$_.status -eq "running"}
工作原理:
当你传递多个对象到where-object时,它会检查每个对象从而进行过滤。一次只放置一个对象到占位符 $_., 接着运行对比来查看返回的时true还是false。
如果时false,该对象就会被移出管道。如果结果为true,该对象就会从where传输到下一个cmdlet的管道中。
占位符 $_. 是一个特殊的产物,该占位符只能在PowerShell能找到特定位置中使用。在我们的例子中,占位符恰好是在其中一个特定位置。
这时候我们使用GM可以让我们快速并且以方便的方式发现一个对象中所包含的属性。这样我们就可以马上使用这些属性进行类似上面的比较。
迭代的命令行模式
我们称PowerShell迭代命令行模式为PSICLM,其核心思想在于你不需要一开始就创建一个大而复杂的命令行,而是从简单的开始。
比如,你想己算正在使用虚拟内存十大进程占用的虚拟内存总量,如果这些进程中含了PowerShell进程,而又不想在结果中包含该进程,快速罗列出几个需要的步骤:
- 获取进程列表: get-Service
- 排除PowerShell进程;
- 按照虚拟内存进行排序;
- 只保存前10个或者后10个,这取决于我们的排序方式; (使用select-object)
- 把剩下进程的虚拟内存相加。
Get-Process | where name -ne "powershell" | SORT VM -Descending | select -First 10 | Measure-Object -Property
vm -sum