Только автоматизация. Только PowerShell.
Предисловие
В качестве хобби и при наличии времени преподаю студентам в УКИТ (бывший Московский государственный колледж информационных технологий). На данный момент у меня мало времени, чтобы уделить его группе студентов, зато вполне достаточно, чтобы подготовить пост здесь, на Хабре.
Я работаю системным администратором в крупной не ИТ-компании с большой завязкой на ИТ ресурсы. По роду деятельности представляется решать большое количество однотипных задач по обслуживанию пользователей.
С языком PowerShell познакомился около двух лет назад, но вплотную занялся им лишь спустя год, не осознав поначалу его огромных возможностей. В статье, прежде всего, я буду ориентироваться на тех, кто хочет начать работать с PowerShell, но пока не доверяет ему или не знает, с какой стороны подступиться к этому чуду.
Внимание: PowerShell вызывает привыкание.
Введение
Википедия говорит нам:
Windows PowerShell — расширяемое средство автоматизации от Microsoft, состоящее из оболочки с интерфейсом командной строки и сопутствующего языка сценариев.
Выглядеть среда PowerShell может так, как командная строка:
powershell.exe
Или в виде приложения:
powershell_ise.exe
Powershell_ise.exe называется интегрированной средой сценариев — Windows PowerShell ISE. Позволяет работать с языком в удобной среде с подсветкой синтаксиса, конструктором команд, автозаполнением команд по нажатию TAB и прочими прелестями. Идеальна для создания и тестирования сценариев.
Для запуска среды powershell.exe или powershell_ise.exe достаточно набрать аналогичное название в строке выполнить.
Файл сценария PowerShell имеет расширение .ps1.
Сценарий не получится запустить двойным ЛКМ. Это сделано специально для того, чтобы не нанести вред системе случайно запущенным скриптом.
Для запуска, по клику ПКМ следует выбрать «Выполнить с помощью PowerShell»:
Помимо того, что существует ограничение по запуску сценариев ЛКМ, по умолчанию выполнение сценариев в системе запрещено, опять же, по описанной выше причине — не нанести вред системе. Для проверки текущей политики выполнения выполним команду:
Get-ExecutionPolicy
Мы получим одно из следующих ниже значений. С большой вероятностью, если это был первый запуск, мы получим Restricted.
- Restricted — Сценарии не могут быть запущены;
- AllSigned — Могут быть запущены только сценарии, подписанные доверенным издателем. Перед выполнением сценария доверенного издателя будет запрашиваться подтверждение;
- RemoteSigned — Разрешено выполнять созданные нами сценарии и скачанные сценарии, подписанные доверенным издателем;
- Unrestricted — Никаких ограничений, все скрипты могут быть запущены.
Для выполнения и тестирования понизим политику до RemoteSigned выполнив команду:
Set-ExecutionPolicy RemoteSigned
Приступаем к работе
Командлет
- Командлетами называются команды PowerShell, в которых заложена различная функциональность;
- Командлеты могут быть как системными, так и пользовательскими, созданные кем-либо;
- Командлеты именуются по правилу Глагол-Существительное, что упрощает их запоминание;
- Командлеты выводят результаты в виде объектов или их коллекций;
- Командлеты могут как получать данные для обработки, так и передавать данные по конвейеру (про конвейеры позже);
- Командлеты не чувствительны к регистру (можно написать и get-process, и Get-Process, и GeT-pRoCeSs);
- После командлетов не обязательно ставить ";", за исключением, когда мы выполняем несколько командлетов в одну строку (Get-Process; Get-Services).
Например, для получения текущих процессов, мы выполним команду:
Get-Process
И получим результат:
Попробуйте самостоятельно выполнить:
Get-Service #для получения статуса служб, запущенных на компьютерах
Get-Content C:WindowsSystem32driversetchosts #для получения содержимого файла. В данном случае, файл hosts
Не обязательно знать наизусть все командлеты. Get-Help спасёт ситуацию.
Информацию о всех доступных командлета можно получить, введя следующую команду:
Get-Help -Category cmdlet
Если мы используем PowerShell ISE, мы облегчаем процесс разработки.
Достаточно ввести знак тире "-" после того, как ввели командлет, и мы получим все возможные варианты параметров и их типы:
Попробуйте выполнить:
Get-Service -Name p*
Если, всё же, мы забудем какие свойства есть у того или иного командлета, прогоним его через Get-Member:
Get-Process | Get-Member
#Знак "|" называется конвейером. О нём ниже.
Недостаточно информации? Обратимся к справке с параметром -Examples:
Get-Help Get-Process -Examples
Получаем описание Get-Process, да ещё и с примерами использования:
- Командлеты могут иметь сокращённые названия — алиасы. Например, вместо Get-Help можно использовать просто Help. Для получения всех сокращений выполните Get-Alias.
Попробуйте выполнить:
Start-Process notepad
Что аналогично записи:
start notepad
А теперь остановим процесс:
Stop-Process -Name notepad
Или так:
spps -Name notepad
Немногим ранее мы сказали, что командлеты именуются по правилу Глагол-Существительное. Уточню, что глагол не обязательно должен быть Get. Помимо того, что мы можем получать, мы можем задавать Set (помните, Set-ExecutionPolicy), запускать Start, останавливать Stop, выводить Out, создавать New и многие другие. Название командлета ничем не ограничивается и, когда мы будем с вами создавать свой собственный, сможем назвать его так, как душе угодно.
Попробуем выполнить вывод в файл:
"Hello, Habr!" Out-File C:test.txt
& C:test.txt
Кстати, аналогично можно записать так:
"Hello, Habr!" > C:test.txt
& C:test.txt
Комментарии
Мы все знаем, использовать комментарии является хорошим тоном.
Комментарии в PowerShell бывают строчные — # и блочные — <#… #>:
Обратим внимание, на код из примера:
Get-WmiObject -Class Win32_OperatingSystem | SELECT Caption
Для тех, кто знаком с WMI, кто делает это на старом добром VBScript, помните, сколько кода надо написать?
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\" & strComputer & "rootcimv2")
Set colItems = objWMIService.ExecQuery("Select * from Win32_OperatingSystem",,48)
For Each objItem in colItems
Wscript.Echo "Caption: " & objItem.Caption
Next
Конвейер
Конвейер (|) — передаёт выходные данные одной команды во входные данные на обработку другой команде. Мы использовали конвейер ранее, получая все свойства объекта или, в предыдущем примере, выбирая из набора данных только поле Caption.
Чтобы понять принцип конвейра, давайте выполним код:
Get-Service | Sort-Object -property Status
Что произойдёт: получаем все службы (Get-Service), передаём все полученные службы на сортировку в командлет Sort-Object и указываем, что хотим отсортировать их по параметру Status. На выводе мы получим сначала все службы со статусом Stop, а потом все службы со статусом Running.
В примере ниже мы сначала получим все запущенные службы. После первого конвейера проходимся по каждому элементу, выбираем только те службы, у которых статус Running и на втором конвейере выбираем, что хотим на выводе увидеть только displayname служб:
Get-Service | WHERE {$_.status -eq "Running"} | SELECT displayname
В примере мы используем $_. Данная запись означает текущий элемент в конвейере.
Послесловие
В этой части мы научились запускать PowerShell, разобрались с политикой выполнения сценариев. Поняли, что такое командлеты, знаем, как передавать их по конвейеру и как получить их свойства. Если мы что-то забудем, обязательно Get-Help.
Все это знания нужные для того, чтобы сделать первый прыжок в язык. Поверьте, ещё много интересного!
Продолжение следует...
С чего ещё начать?
- Скачать PowerShell v.4 бесплатно без регистрации;
- Замечательный курс на MVA: Расширенные возможности и написание скриптов в PowerShell 3.0 (Jump Start). Мой совет — посмотрите первые 3 блока, окунитесь в язык, попробуйте повыполнять какие-нибудь задачи и через недельку смотрите оставшиеся блоки. Русские субтитры;
- Галлерея скриптов PowerShell на Technet;
- Блог разработчиков PowerShell.
P.S. Жаль, что на Хабре не добавлен синтаксис PowerShell.
Автор: bgelov