Главная

Thursday, 10 May 2018

Фильтрация вывода в PowerShell.

Привет.

Вы знаете чем в PowerShell фильтровать вывод Get-командлетов?

Любой запрос типа Get выдаст нам кучу информации. А наша задача выделить из него самое нужное. Варианты есть.

Sort-Object и Group-Object

Недавно я рассказывал про форматирование вывода в Out-GridView. Так вот там для фильтрации(форматирования) результата выполнения команд были затронуты функции Sort-Object и Group-Object. Вы помните что важна последовательность использования этих функций в одном вызове.

Where-Object

Результат выполнения почти любого запроса может содержать много дополнительной информации. Предположим, нам требуется вывести имена командлетов которые только получают информацию в домене. Эту задачу позволяет решить команда where-object, которую практически никогда не вызывают по полному имени, а просто Where. 
Вот так:
Get-Command -Module ActiveDirectory | where {$_.Name -like 'Get-*'}

Как свести результаты PowerShell к самому необходимому неплохо рассказано здесь.

Select-Object

Это еще не все. Начинаем комбинировать и отсекаем лишние поля знакомым нам Select по традиционному SQL:
Get-ADComputer -filter "Enabled -eq 'False'" | Select Name

Возможна комбинация фильтра с Where:
get-aduser -f * | where {$_.samaccountname -like "Eugen*"}

Тоже самое можно получить и только фильтром:
get-aduser -filter {Samaccountname -like "Eugen*"}


Ну а как правильно? - спросите вы. С технической точки зрения оба способа работают, но: такой подход может привести к излишней трате полосы пропускания и ресурсов сервера. И вот почему. Команда get-aduser с фильтром посылает команду контроллеру домена (DC), и DC возвращает лишь небольшое подмножество AD. Когда же результат get-aduser -f * подается на вход where-object, у DC запрашиваются все учетные записи пользователей на ваш ПК, после чего уже ваш ПК отфильтровывает их, оставляя только нужные данные. Таким образом, where-object – отличный инструмент, однако следует избегать его применения когда у исходной команды get-whatever уже есть встроенный фильтр.

Тут у вас вопрос - как узнать если у очередного командлета этот самый Filter?

Допустим мы открыли новый для нас мифический командлет Get-WhatEver. Прощупаем его на фильтр.

Первый способ через справку:
Get-Help Get-WhatEver

Второй способ через дополнение используя PowerTab. Мега-удобная вещь.

И третий способ через щелкание Tab-ом.
Т.е. пишем Get-WhatEver -f... и с помощью Tab-а проверяем подскажет нам консоль опцию Filter или нет.

Еще фишка, в некоторых случаях форматирование вывода не достанет нужное свойство если мы его не укажем явно в конвейере:
get-ADUser -Filter {EmailAddress -notlike "*forza.com.ua"} -Properties EmailAddress | ft Name,EmailAddress

Успехов.

No comments:

Post a Comment

А что вы думаете по этому поводу?