Фильтруйте вывод команды, как если бы это был текст - PullRequest
14 голосов
/ 09 июля 2011

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

Я хочу получить список запущенных служб с именем «sql» в них..

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

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

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

get-service | select-string sql

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

Ответы [ 8 ]

11 голосов
/ 09 июля 2011

Ты слишком усердно работаешь над этим:

get-service *sql*
9 голосов
/ 09 июля 2011

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

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

Get-service | Get-Member

Таким образом, вы поймете, что

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

также работает, и там у вас есть свой текст как СОБСТВЕННОСТЬ объекта

8 голосов
/ 05 сентября 2014
Get-service | Select-String -Pattern "sql"

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

Get-service | Select-String -Pattern "sql" | sort
7 голосов
/ 10 июля 2011

Другие ответы, конечно, правы относительно вашего конкретного вопроса о запуске служб, в названии которых есть «sql», но для ответа на общий вопрос:

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

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

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

5 голосов
/ 14 апреля 2017

Большинство ответов здесь сосредоточены на поиске имени службы с «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.

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

2 голосов
/ 11 июля 2011

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

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

get-service | select -expand name

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

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

1 голос
/ 27 августа 2014

Если кому-то нужна дополнительная информация о логических операциях, см. http://technet.microsoft.com/en-us/library/ee177028.aspx

-lt - Менее

• -le - меньше или равно

• -gt - больше чем

• -ge - больше или равно

• -экв. - равно

• -не - Не равно

• -подобный использует шаблоны для сопоставления с образцом

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<br> ------ ---- -----------<br> Running Net Driver HPZ12 Net Driver HPZ12<br> Running Netlogon Netlogon

0 голосов
/ 29 ноября 2017

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...