Отфильтруйте вывод команды, как если бы это был текст
У меня есть простой вопрос, но я также новичок в 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 для вашего сердечного контента.