首页 > 解决方案 > Powershell:如何使用“select-string”“grep”命令的输出?

问题描述

当我发出get-service命令时,我得到了整个服务列表。

我只想列出特定的服务。

有问题的服务列在以下输出中get-service

Running  nginx              nginx

但是,如果我尝试使用以下任何一种:

PS C:\Users\x> get-service | Select-String "nginx"
PS C:\Users\x> get-service | Select-String -Pattern "nginx"
PS C:\Users\x> get-service | Select-String -Pattern 'nginx'

我没有输出。

那么我如何在 Powershell 中“grep”呢?

标签: powershell

解决方案


需要注意的重要一点是 PowerShell cmdlet始终输出对象,而不是简单的字符串 - 即使输出看起来是字符串,它实际上也是一个System.String对象。您可以使用Get-Member检查命令输出的类型(以及相关的属性和方法):

Get-Service | Get-Member

   TypeName: System.ServiceProcess.ServiceController

Name                      MemberType    Definition
----                      ----------    ----------
Name                      AliasProperty Name = ServiceName
RequiredServices          AliasProperty RequiredServices = ServicesDependedOn
Disposed                  Event         System.EventHandler Disposed(System.Object, System.EventArgs)
Close                     Method        void Close()
Continue                  Method        void Continue()
...

正如其他人所提到的,Get-Service(和其他 cmdlet)具有针对您要执行的操作的内置过滤,但更通用的替代方案是Where-Object ,它更灵活(虽然通常更慢) :

Get-Service | Where-Object {$_.Name -like 's*' -and $_.Status -eq 'Running'}

Status   Name               DisplayName
------   ----               -----------
Running  SamSs              Security Accounts Manager
Running  SCardSvr           Smart Card
Running  Schedule           Task Scheduler
Running  SecurityHealthS... Windows Security Service
Running  SENS               System Event Notification Service
...

推荐阅读