Отфильтруйте вывод команды, как если бы это был текст

У меня есть простой вопрос, но я также новичок в PowerShell. Я думаю, что это связано с тем, что вывод команд ps - это объекты, а не текст.

Что я хочу сделать, так это получить список запущенных служб, в которых есть имя "sql".

Это то, что я пробовал до сих пор, но каждая попытка ничего не возвращает:

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

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

get-service | select-string sql

Я ищу шаблон, который позволяет обрабатывать вывод каждой команды как текст с возможностью поиска.

Ответ 1

Другие ответы правильны, конечно, о вашем конкретном вопросе о запуске сервисов, которые имеют "sql" от их имени, но чтобы ответить на общий вопрос:

Вы можете сделать get-service | out-string, и вы получите вывод как строку, как и как работают команды Unix.

Также, когда вывод передается в команды без полномочий, он преобразуется в текст, поэтому, например: get-service | grep sql будет работать так, как вы хотели.

Но опять же, как и @JPBlanc, он хорошо понимает, как работает Powershell, а именно, что выходы являются объектами. Это дает вам больше возможностей для управления и делает вещи простыми и читаемыми (команды Unix с sed, awk и то, что не работает на текстовом выходе других командных выходов, могут быть очень загадочными!)

Ответ 2

Вы слишком много работаете над этим:

get-service *sql*

Ответ 3

Том просто "ЗАБУДЬТЕ ЭТО": o) Выводимые объекты ARE вы правы, и вы собираетесь использовать это.

Итак, у @mjolinor есть самый короткий ответ, но для ваших знаний просто проверьте:

Get-service | Get-Member

Итак, вы поймете, что

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

также работает, и там вы получили свой текст как свойство объекта

Ответ 4

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

Это работает так же, как grep. И вы даже можете сортировать

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

Ответ 5

То, что текст имени является свойством объекта, имеет важное значение для того, чтобы обвести голову и как использовать значения свойств в фильтре.

Другим аспектом Powershell, который вы можете использовать для решения этой проблемы, является выбор свойств объектов с помощью select-object:

get-service | select -expand name

вы получите строковый массив с именами серверов, и два из ваших трех исходных фильтров будут работать над этим. "-like" не работает, потому что в тестовой строке нет подстановочных знаков. Единственное, что когда-либо будет соответствовать, это просто "sql".

Я по-прежнему считаю, что первое решение, которое я опубликовал, лучше всего. Важно знать, как выполнять позднюю фильтрацию, но также как использовать раннюю фильтрацию, когда сможете.

Ответ 6

Если кто-то хочет получить дополнительную информацию о логических операциях, см. 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

Большинство ответов здесь сосредоточены на поиске имени службы с "sql" в имени, а не на фильтрации всего вывода, как если бы это был текст. Кроме того, в принятом ответе используется функция non-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.

Это пуристский ответ, и на практике для этого конкретного случая использования я бы не рекомендовал его. Но для людей, приезжающих сюда через google на основе названия вопроса, это более точный ответ...

Ответ 8

Вероятно, вы хотите:

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 по всем свойствам объекта.

Поместите его в свои файлы конфигурации и grep для вашего сердечного контента.