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

时间:2011-07-09 13:35:42

标签: powershell

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

我想要的是获取一个名为“sql”的服务列表。

这是我到目前为止所尝试的,但每次尝试都不会返回任何内容:

get-service | where {$_ -match 'sql'}

get-service | where {$_ -like 'sql'}

get-service | select-string sql

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

10 个答案:

答案 0 :(得分:11)

你的工作太过努力了:

get-service *sql*

答案 1 :(得分:9)

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

所以@mjolinor的答案最短,但据你所知只是测试:

Get-service | Get-Member

所以你会理解

Get-service | Where-Object {$_.name -match ".*sql.*" }

也有效,并且您已将文本作为对象的属性

答案 2 :(得分:8)

Get-service | Select-String -Pattern "sql"

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

Get-service | Select-String -Pattern "sql" | sort

答案 3 :(得分:7)

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

您可以执行get-service | out-string,您将获得输出为字符串,就像Unix命令的工作方式一样。

此外,当输出通过管道输出到非powershell命令时,它会转换为文本,因此例如:get-service | grep sql将以您希望的方式工作。

但是,就像@JPBlanc所说的那样,好好接受Powershell的工作方式,即输出是对象。它为您提供了更多的控制方式,并使事情变得简单易读(带有sed,awk的Unix命令以及不在其他命令输出的文本输出上运行的命令会变得非常神秘!)

答案 4 :(得分:4)

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

所以,授予,以下内容并不是最优雅的解决方案,但为了完整起见,我想提供100%的PowerShell解决方案,从字面上解决OP的问题:

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

这是一个纯粹的答案,在实践中,对于这个特定的用例,我不推荐它。但对于根据问题标题通过谷歌来到这里的人来说,这是一个更准确的答案......

答案 5 :(得分:2)

名称的文本是对象的属性非常重要,以及如何在过滤器中使用属性值。

您可以利用Powershell解决此问题的另一个方面是使用select-object从对象中选择属性:

get-service | select -expand name

将为您提供一个包含服务器名称的字符串数组,并且您的原始三个过滤器中的两个将对其起作用。 -like不起作用,因为测试字符串中没有通配符。它唯一匹配的只是'sql'。

我仍然相信我发布的第一个解决方案是最好的。重要的是要知道如何进行延迟过滤,以及如何尽可能使用早期过滤。

答案 6 :(得分:1)

如果有人想了解有关逻辑操作的更多信息,请参阅http://technet.microsoft.com/en-us/library/ee177028.aspx

-lt - 小于

•  -le - 小于或等于

•  -gt - 大于

•  -ge - 大于或等于

•  -eq - 等于

•  -ne - 不等于

•  像 - 喜欢;使用通配符进行模式匹配

get-service | where {$_ -match 'sql'} would be get-service | where {$_ -eq "sql"}

get-service | where {$_ -like 'sql'} would be get-service | where {$_ -like "sql"}

现在是一个实际的例子。

PS C:\> Get-Service | where {$_.name -like "net*"}

Status Name DisplayName
------ ---- -----------
Running Net Driver HPZ12 Net Driver HPZ12
Running Netlogon Netlogon

答案 7 :(得分:1)

如果要列出服务名称中带有“sql”的所有服务,只需使用:

 get-service -name *sql*

答案 8 :(得分:0)

你可能想要这个:

Function Select-ObjectPropertyValues {
    param(
    [Parameter(Mandatory=$true,Position=0)]
    [String]
    $Pattern,
    [Parameter(ValueFromPipeline)]
    $input)

    $input | Where-Object {($_.PSObject.Properties | Where-Object {$_.Value -match $Pattern} | Measure-Object).count -gt 0} | Write-Output
}

我们在这里做的是通过一个对象的每个属性来查看它是否与给定的模式匹配。如果对象包含一个或多个这样的属性,我们将其写出来。最终结果:grep来自对象的所有属性。

将它放入您的配置文件中,然后根据您的内容进行操作。

答案 9 :(得分:0)

怎么样:

Get-Service| Out-String -stream | Select-String sql

关键点在于-stream选项将Out-String输出转换为单独的文本行。