Введение в PowerShell

Данная статья была создана в дополнение к видео уроку PowerShell за 20 минут. В ней еще раз перечислены те принципы и подходы к PowerShell, которые позволят начать использовать PowerShell в своей работе. Введение в PowerShell — это описание основных команд PowerShell, описание процесса поиска команд и использование справки. Кратко изложены принципы конвейера команд, фильтрации результата и форматирования вывода. Показано использования PowerShell ISE для освоения PowerShell.

Команды, алиасы, структура команды

Запустить PowerShell можно достаточно легко в поиске Стартового Окна Windows набрать PowerShell. Обратите внимание, что PowerShell зачастую используется для решения административных задач, поэтому возможно вам понадобиться запустить его от имени администратора. Для этого в результатах поиска щелкаем правой кнопкой мыши и выбираем «запуск от имени администратора».

Запуск PowerShell
Запуск консоли PowerShell от имени администратора

Конечно если это серверная операционная система, то PowerShell доступен сразу из панели задач. После запуска откроется основная консоль PowerShell в которую можно вводить команды.

Консоль PowerShell
Окно консоли PowerShell

Каждая команда PowerShell ее еще иногда называют командлет или CmdLet состоит из двух частей глагол (Get, Set, Add, Invoke, Remove и т.д.) и существительного (Service, VM, AzureAccount, DHCPServerSetting). Каждая часть отделяется от другой одним дефисом. Других дефисов в командлете быть не может. При наборе команд можно использовать клавишу Tab, которая позволяет автоматически закончить ввод команды. Tab можно нажимать несколько раз при этом будет осуществляться перебор подходящих команд. Кстати комбинация Shift+Tab так же работает и перебирает команды в обратном порядке. Для исполнения необходимо нажать клавишу Enter.

Данная команда Get-ChildItem без параметров выдает содержимое текущего каталога. У некоторых командлетов в PowerShell существуют алиасы, т.е. другой вариант написания того же командлета. Алиасы делают использование PowerShell более простым и легким. Так у командлета Get-ChildItem есть алиасы dir и ls. Кроме того существуют такие алиасы как copy, cp, rm, mkdir и т.д. просмотерть весь список алиасов можно выполнив командлет Get-Alias.

Поиск команд, параметры команд

Для успешного освоения PowerShell необходимо уметь быстро искать нужные команды PowerShell. Для поиска командлетов можно использовать команду Get-Command. У данного командлета есть параметр Name после которого необходимо указать название командлета информацию по которому необходимо получить.

Все параметры в PowerShell начинаются со знака дефис за которым следует название этого параметра и через пробел или знак двоеточие идет значение этого параметра. Обратите внимание при наборе параметров так же можно использовать Tab, а для некоторых командлетов можно так же использовать Tab при наборе значений параметров.

Для параметра Name командлета Get-Command можно использовать подстановочные символы такие как * и ?. Это очень облегчает задачу поиска команд. Мы можем просто использовать какое-то ключевое слово. В данном статье мы будем разбирать настройку DNS сервера.

Команда ниже дает список все командлетов связанных с DNS.

Некоторые параметр некоторых командлетов можно не указывать, а просто указать значение. PowerShell сам по типу значения подберет необходимый параметр. Команда ниже будет иметь такой же результат, как и команда выше.

PowerShell модульный язык. И каждый командлет относится к определенному модулю. Вы можете устанавливать дополнительные модули, тем самым расширяя функционал. При установке большинства ролей Windows Server автоматически устанавливаются соответсвующие модули PowerShell. Нас интересуют команды относящиеся к модулю DnsServer

Команд достаточно много, для уточнения критериев возможно использовать сразу несколько параметров командлета. Давайте создадим новую зону. Для этого просмотрим все команды, которые работают с Зонами в DnsServer

Логично предположить, что команда позволит создать новую основную зону называется Add-DnsServerPrimaryZone.

Справка

Но для того чтобы использовать ту или иную команду, необходимо знать, как ей пользоваться. В общем-то если вы даже не уверены в том, что выбранная команда вам подходит, вы всегда можете воспользоваться справкой. Для получения справки необходимо воспользоваться командой Get-Help, после которой указать имя интересующего вас командлета.

Однако это лишь очень карткая справка. В ней вы найдете опсание команды и синтаксис. Для более подробной справки вы можете указать параметр ShowWindow командлета Get-Help

После этого откроется отдельное окно со справкой по данному коммадлету.

Окно Get-Help
Окно справки Get-Help

Но обычно достаточно просто примеров для того чтобы понять как воспользоваться тем или иным командлетом. Параметр Examples командлета Get-Help отображает только примеры использования выбранного командлета.

Как видно для данного командлета имеется четыре примера.

Использование команд

Безусловно в статье введение в PowerShell необходимо продемонстрировать каким именно образом использовать команды. Я бы очень рекомендовал вам ознакомиться с видео уроком PowerShell где это отображено более наглядно.

Мы определились с синтаксисом команды из справки или просто нашли команду в каком-то руководстве.

В нашем случае отлично подходит второй пример из спрвки. Т.к. на мой компьютер не является контроллером домена мы будем создавать основную зону DNS в файле.

Не забывайте при этом использовать клавишу Tab при наборе командлета и его параметров. В данном примере я создаю зону Get-PowerShell.ru в файле getpowershell.ru.dns

Результат большинства командлетов по конфигурированию не выводится на экран. Поэтому при успешном выполнении вы получите приглашение командной строки для ввода следующей команды. Ну а если будет ошибка будет подробно описано в каком месте вы совершили ошибку.

Теперь нам нужно убедиться, что данная зона создана.

В большинстве случаев если вы определились с комадлетом для создания (изменения, просмотра) то существительное этого комадлета можно использоваться для просмотра, изменения, создания нужно просто поменять соответствующую глагольную часть на Get, Set, New соответственно.

Т.е. если, например, для просмотра профилей сетевых подключений вы использовали:

То для изменения вам достаточно поменять Get на Set, оставив существительное без изменения.

Но увы зоны DNS сервера этому правилу не сосуществуют. Поэтому для поиска команды которая выводит список зон, я снова мог воспользоваться команделтом Get-Command. Однако, я воспользовался перебором, используя клавишу Tab. Я набрал Get-DnsServer и щелкал клавишей Tab. Через несколько нажатий вывелась подходящая команда.

Далее я набрал дефис и начал нажимать клавишу Tab через некоторое количество нажатий у меня появился подходящий параметр ZoneName, после которого я указал название вновь созданной зоны.

Введение в PowerShell Pipeline или конвейер

Самое замечательное что PowerShell в качетсве результата командетов возвращает объекты. С которыми вы можете далее делать все возможные операции, например, изменение, удаление, фильтрацию. Для этого можно воспользоваться конвеером.

Конвейер или Pipeline это некая последовательность командлетов записанная в одной строке и выполняемая особым образом. Каждый командлет отделяется от другого вертикальной чертой. Команды в конвейере выполняются последовательно слева направо. После выполнения первой команды ее вывод направляется на ввод следующей.

В данном примере информация о зоне Get-PowerShell.ru была передана на вход команды Set-DnsServerPrimaryZone и у нее было изменено свойство динамического обновления.

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

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

PowerShell ISE

PowerShell ISE – это среда разработки скриптов PowerShell. В ней реализован богатый функционал по созданию и отладке скриптов.

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

PowerShell ISE позволяет лишь ускорить, упростить процесс написания и отладки скрипта. ISE не обязателен к использованию.

Запустить PowerShell ISE можно из меню пуск или щелкнув правой кнопкой мыши по иконке PowerShell в панели задач.

Запуск PowerShell ISE
Запуск PowerShell ISE

В PowerShell ISE справа присутствует панель «Команды», которая позволяет не только быстро находить командлеты, но еще и в оконном режиме задавать их параметры.

Давайте попробуем найти команду, создающую записи для DNS зоны. Для этого в поле имя введем Recor.

Поиск команды в PowerShell ISE
Поиск команды в PowerShell ISE

Отобразиться список подходящих по критерию команд. Давайте добавим запись DNS, выбрав команду Add-DnsServerResourceRecord.

Далее нам нужно выбрать, запись типа A, ввести IP адрес, имя и зону.

Вставка команды в PowerShell ISE
Вставка команды в PowerShell ISE

Если нажать на кнопку «Вставить», то данные из окна преобразуются в команду PowerShell и команда вставляется рядом с курсором. У меня получилась данная команда:

Давайте посмотрим те записи, которые есть в DNS сервере. Для этого в области консоли в PowerShell ISE начинаем набирать Get-DnsServer и ждем.

Должно открыться контекстное меню со списком подходящих командлетов, если этого не произошло жмем Ctrl+Пробел.

IntelliSence в PowerShell ISE
IntelliSence в PowerShell ISE

Далее выбираем Get-DnsServerResourceRecord и нажимаем Enter. PowerShell запросит значение для обязательного, но не указанного параметра

Ввод не указанного параметра PowerShell
Ввод не указанного параметра PowerShell

Отображение результатов

После указания данного параметра выведется список ресурсных записей в указанной зоне.

Иногда необходимо отображать не все записи, а только необходимые. Тут возможны два варианта. Использовать возможности фильтрации командлета возвращающего результат. Яркий пример такого способа это Get-ADUser и его параметр Filter. Второй способ предполагает использования конвейера. О нем и пойдет речь.

Out-GridView командлет, который отображает объекты в виде отдельного окна. Позволяя фильтровать и сортировать их в удобном оконном интерфейсе. Правда больше вы ничего с этими объектами сделать не сможете. Давайте применим данный командлет к нашему списку DNS записей.

После чего мы видим отдельное окно.

Окно Out-GridView
Окно Out-GridView

Иногда приходится менять представление отображаемых объектов с табличного на список, со списка на табличный. Для этого можно использовать два командлета и их алиасы Format-List (fl) и Format-Table (ft). Я думаю примеров будет достаточно для понимания.

Для фильтрации можно использовать командлет Where-Object или его алиасы Where и “?”. В самом простом синтаксисе использования Where-Object необходимо указать свойство объекта, операцию сравнения и сравниваемое значение.

Операции сравнения могут быть –eq (равно), -lt (меньше чем), -gt (больше чем), -like (сравнение со строкой) и другие.

Но иногда данного синтаксиса недостаточно и нужно использовать блок сравнения. Блок сравнения во многом похож на упрощенный вариант Where-Object, однако позволяет использовать несколько сравнений и более сложные регулярные выражения.

Здесь $_ — это текущий элемент массива поступившего на вход команды Where-Object. А $_.RecordType – свойство RecordType текущего элемента.

Безусловно в рамках статьи введение в PowerShell невозможно в полной мере описать данный синтаксис, хотя вы можете углубиться и изучить мою статью использование в PowerShell Where, Where-Object, ?.

И конечно с отфильтрованными данными вы можете производить различные действия. Изменять, редактировать, экспортировать и использовать для других задач. В данном примере запись удаляется.

 

3 комментария

  1. Други, почему при использовании Get-DnsServerResourceRecord в Timestamp отображается 0, а не дата? Если использовать GUI для просмотра DNS записей, то явно видны дата и время…

    1. Добрый день. Вообще TimeStamp отображается только для динамических записей. У меня в примере таких нет. Но я проверил на боевом сервере — там все отображается как в GUI так и в PowerShell.

      1. Добрый день. Позволю вклиниться в стародавний диалог в коментах. На самом деле у статических записей, у которых в GUI стоит static в поле TimeStamp, Powershell по итогу выдаёт в поле TimeStamp 0. Долго думал как сделать выборку чтобы в неё вошли записи старше определённой даты, но туда попадали статические записи, удаление которых было не нужно. В итоге такое выражение работает : ?{$_.TimeStamp -lt ‘01.01.2020 00:00:00’ -and $_.TimeStamp -gt 0}

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

CAPTCHA ImageChange Image