过滤命令的输出,就像它是文本一样

buc*_*ley 14 powershell

我有一个简单的问题,但我也是PowerShell的初学者.我认为这与ps命令的输出是对象而不是文本的事实有关.

我想要做的是获取一个名为"sql"的服务列表.

这是我到目前为止所尝试的但是每次尝试都没有返回:

Get-Service | where {$_ -match 'sql'}

Get-Service | where {$_ -like 'sql'}

Get-Service | Select-String sql
Run Code Online (Sandbox Code Playgroud)

我正在寻找一种模式,让我将每个命令的输出视为可搜索的文本.

mjo*_*nor 10

你的工作太过努力了:

Get-Service *sql*
Run Code Online (Sandbox Code Playgroud)

  • 这个答案实际上是错误的。这样做是通过对象的.Name参数进行搜索,而不是通过文本输出中显示的所有参数进行搜索。因此,“ Get-service * Stopped *”不返回任何内容,而“ Get-Service | out-string | findstr Stopped”将返回。这是OP的问题... (2认同)
  • @PeterMortensen - 不。经过三年的手术、化疗、放疗和免疫治疗,我的体重降到了 112 磅,一只完好的手臂,以及上帝赐予热硝酸甘油的所有耐心。这是很久以前从我的《死亡山丘大书》最后一页的底部掉下来的。 (2认同)

JPB*_*anc 10

汤姆只是'忘记它':o)输出你正确的对象,你将使用它.

所以@mjolinor答案最短,但为了您的知识,只需测试:

Get-Service | Get-Member
Run Code Online (Sandbox Code Playgroud)

所以你会明白的

Get-Service | Where-Object {$_.name -match ".*sql.*" }
Run Code Online (Sandbox Code Playgroud)

也有效,在那里你有你的文本作为对象的属性


Ste*_*ter 9

Get-Service | Select-String -Pattern "sql"
Run Code Online (Sandbox Code Playgroud)

这就像grep一样.你甚至可以排序

Get-Service | Select-String -Pattern "sql" | sort
Run Code Online (Sandbox Code Playgroud)


man*_*lds 7

其他答案当然是关于您在其名称中启动具有"sql"的服务的具体问题,但回答一般性问题:

您可以这样做Get-Service | Out-String,您将获得输出为字符串,就像Unix命令的工作方式一样.

此外,当输出通过管道输出到非powershell命令时,它会转换为文本,因此例如:Get-Service | grep sql将按照您想要的方式工作.

但同样,就像@JPBlanc所说的那样,很好地接受Powershell的工作方式,即输出是对象.它为您提供了更多控制并保持简单和可读的方式(使用sed,awk的Unix命令以及在其他命令输出的文本输出上运行的内容可能会变得非常神秘!)


Wou*_*ter 7

此处的大多数答案都集中在查找名称中带有“ sql”的服务名称,而不是像过滤文本一样过滤整个输出。另外,接受的答案使用非PowerShell函数“ findstr”。

因此,理所当然的是,这并不是最优雅的解决方案,但是出于完整性考虑,我想提供100%PowerShell解决方案,该解决方案从字面上考虑了OP的问题:

(get-Service | Out-String) -split "`r`n" | Select-String sql
Run Code Online (Sandbox Code Playgroud)
  • 我们需要Out-String,因为使用其他答案中提供的解决方案并不能为我们提供Get-Service命令的全文输出,而只能为Name参数提供。
  • 我们需要分割换行符,因为Select-String似乎将整个文本视为一个长字符串,并且如果在其中找到了“ sql”,则将其作为一个整体返回。
  • 我使用Select-String而不是findstr,因为findstr不是PowerShell函数。

这是一个纯粹的答案,在实践中,对于此特定用例,我不建议这样做。但是对于根据问题标题通过Google搜索来到这里的人们来说,这是一个更准确的答案...

  • 非常感谢您的简洁解释。真的帮了我大忙。但为什么必须将第一个管道放在括号中呢? (2认同)
  • 您可以通过删除它们来测试这一点。然后您会发现,删除括号会导致 -split 参数直接应用于 Out-String cmdlet,而不是 (get-Service | Out-String) 的结果。 (2认同)

小智 5

如果有人想了解有关逻辑操作的更多信息,请参阅使用Where-Object Cmdlet

\n\n

\xe2\x80\xa2 -lt -- 小于

\n\n

\xe2\x80\xa2 -le -- 小于或等于

\n\n

\xe2\x80\xa2 -gt -- 大于

\n\n

\xe2\x80\xa2 -ge -- 大于或等于

\n\n

\xe2\x80\xa2 -eq -- 等于

\n\n

\xe2\x80\xa2 -ne -- 不等于

\n\n

\xe2\x80\xa2 -like - 喜欢;使用通配符进行模式匹配

\n\n

Get-Service | where {$_ -match \'sql\'}将会Get-Service | where {$_ -eq "sql"}

\n\n

Get-Service | where {$_ -like \'sql\'}将会Get-Service | where {$_ -like "sql"}

\n\n

现在是一个实际的例子。

\n\n
PS C:\\> Get-Service | where {$_.name -like "net*"}\n\nStatus   Name               DisplayName\n------   ----               -----------\nRunning  Net Driver HPZ12   Net Driver HPZ12\nRunning  Netlogon           Netlogon\n
Run Code Online (Sandbox Code Playgroud)\n