Только автоматизация. Только PowerShell.
![](https://habrastorage.org/r/w1560/files/dc3/20a/c3a/dc320ac3ae3045afad6c394bce588cc2.png)
В качестве хобби и при наличии времени преподаю студентам в УКИТ (бывший Московский государственный колледж информационных технологий). На данный момент у меня мало времени, чтобы уделить его группе студентов, зато вполне достаточно, чтобы подготовить пост здесь, на Хабре.
Я работаю системным администратором в крупной не ИТ-компании с большой завязкой на ИТ ресурсы. По роду деятельности представляется решать большое количество однотипных задач по обслуживанию пользователей.
С языком PowerShell познакомился около двух лет назад, но вплотную занялся им лишь спустя год, не осознав поначалу его огромных возможностей. В статье, прежде всего, я буду ориентироваться на тех, кто хочет начать работать с PowerShell, но пока не доверяет ему или не знает, с какой стороны подступиться к этому чуду.
Внимание: PowerShell вызывает привыкание.
Википедия говорит нам:
Выглядеть среда PowerShell может так, как командная строка:
![](https://habrastorage.org/r/w1560/files/2e9/440/76b/2e944076b4dc40b89429367ebfb80af8.png)
powershell.exe
Или в виде приложения:
![](https://habrastorage.org/r/w1560/files/e5f/bec/a27/e5fbeca272e14f918aa13361c266ab27.png)
powershell_ise.exe
Powershell_ise.exe называется интегрированной средой сценариев — Windows PowerShell ISE. Позволяет работать с языком в удобной среде с подсветкой синтаксиса, конструктором команд, автозаполнением команд по нажатию TAB и прочими прелестями. Идеальна для создания и тестирования сценариев.
Для запуска среды powershell.exe или powershell_ise.exe достаточно набрать аналогичное название в строке выполнить.
![](https://habrastorage.org/r/w1560/files/e09/624/761/e09624761ee9494d8cfb25dfb0a8d850.png)
Файл сценария PowerShell имеет расширение .ps1.
![](https://habrastorage.org/r/w1560/files/82b/01b/c33/82b01bc332bd4295ab104b526890b6ff.png)
Сценарий не получится запустить двойным ЛКМ. Это сделано специально для того, чтобы не нанести вред системе случайно запущенным скриптом.
Для запуска, по клику ПКМ следует выбрать «Выполнить с помощью PowerShell»:
![](https://habrastorage.org/r/w1560/files/53e/d1c/de6/53ed1cde616e4e10be00c98fd80a6a0f.png)
Помимо того, что существует ограничение по запуску сценариев ЛКМ, по умолчанию выполнение сценариев в системе запрещено, опять же, по описанной выше причине — не нанести вред системе. Для проверки текущей политики выполнения выполним команду:
![](https://habrastorage.org/r/w1560/files/46e/399/fc7/46e399fc77324041978b57310cfbc131.png)
Мы получим одно из следующих ниже значений. С большой вероятностью, если это был первый запуск, мы получим Restricted.
Для выполнения и тестирования понизим политику до RemoteSigned выполнив команду:
![](https://habrastorage.org/r/w1560/files/285/fa8/3be/285fa83be2c140b0ba27be283af09700.png)
Например, для получения текущих процессов, мы выполним команду:
И получим результат:
![](https://habrastorage.org/r/w1560/files/d44/79d/925/d4479d925d0d48789ebbd0b1ee6a987a.png)
Попробуйте самостоятельно выполнить:
Не обязательно знать наизусть все командлеты. Get-Help спасёт ситуацию.
Информацию о всех доступных командлетах можно получить, введя следующую команду:
Если мы используем PowerShell ISE, мы облегчаем процесс разработки.
Достаточно ввести знак тире "-" после того, как ввели командлет, и мы получим все возможные варианты параметров и их типы:
![](https://habrastorage.org/r/w780q1/files/c8f/6d3/a65/c8f6d3a653fd492381e743556039cc57.jpg)
Попробуйте выполнить:
Если, всё же, мы забудем какие свойства есть у того или иного командлета, прогоним его через Get-Member:
![](https://habrastorage.org/r/w1560/files/06d/c52/510/06dc52510ac246059cfecd8cb3a7a540.png)
Недостаточно информации? Обратимся к справке с параметром -Examples:
Получаем описание Get-Process, да ещё и с примерами использования:
![](https://habrastorage.org/r/w1560/files/a5f/103/2c6/a5f1032c6cc947c6b845432903ea191b.png)
Попробуйте выполнить:
Что аналогично записи:
А теперь остановим процесс:
Или так:
Немногим ранее мы сказали, что командлеты именуются по правилу Глагол-Существительное. Уточню, что глагол не обязательно должен быть Get. Помимо того, что мы можем получать, мы можем задавать Set (помните, Set-ExecutionPolicy), запускать Start, останавливать Stop, выводить Out, создавать New и многие другие. Название командлета ни чем не ограничивается и, когда мы будем с вами создавать свой собственный, сможем назвать его так, как душе угодно.
Попробуем выполнить вывод в файл:
Кстати, аналогично можно записать так:
Мы все знаем, использовать комментарии является хорошим тоном.
Комментарии в PowerShell бывают строчные — # и блочные — <#… #>:
![](https://habrastorage.org/r/w1560/files/269/ade/007/269ade0072c34614bfeca0a16344822d.png)
Обратим внимание, на код из примера:
Для тех, кто знаком с WMI, кто делает это на старом добром VBScript, помните, сколько кода надо написать?
Конвейер (|) — передаёт выходные данные одной команды во входные данные на обработку другой команде. Мы использовали конвейер ранее, получая все свойства объекта или, в предыдущем примере, выбирая из набора данных только поле Caption.
Чтобы понять принцип конвейера, давайте выполним код:
Что произойдёт: получаем все службы (Get-Service), передаём все полученные службы на сортировку в командлет Sort-Object и указываем, что хотим отсортировать их по параметру Status. На выводе мы получим сначала все службы со статусом Stop, а потом все службы со статусом Running.
В примере ниже мы сначала получим все запущенные службы. После первого конвейера проходимся по каждому элементу, выбираем только те службы, у которых статус Running и на втором конвейере выбираем, что хотим на выводе увидеть только displayname служб:
В примере мы используем $_. Данная запись означает текущий элемент в конвейере.
![](https://habrastorage.org/r/w1560/files/d62/d85/714/d62d8571425c48b480b73a47fa6319a8.png)
В этой части мы научились запускать PowerShell, разобрались с политикой выполнения сценариев. Поняли, что такое командлеты, знаем, как передавать их по конвейеру и как получить их свойства. Если мы что-то забудем, обязательно Get-Help.
Все это знания нужные для того, чтобы сделать первый прыжок в язык. Поверьте, ещё много интересного!
![](https://habrastorage.org/files/dc3/20a/c3a/dc320ac3ae3045afad6c394bce588cc2.png)
Предисловие
В качестве хобби и при наличии времени преподаю студентам в УКИТ (бывший Московский государственный колледж информационных технологий). На данный момент у меня мало времени, чтобы уделить его группе студентов, зато вполне достаточно, чтобы подготовить пост здесь, на Хабре.
Я работаю системным администратором в крупной не ИТ-компании с большой завязкой на ИТ ресурсы. По роду деятельности представляется решать большое количество однотипных задач по обслуживанию пользователей.
С языком PowerShell познакомился около двух лет назад, но вплотную занялся им лишь спустя год, не осознав поначалу его огромных возможностей. В статье, прежде всего, я буду ориентироваться на тех, кто хочет начать работать с PowerShell, но пока не доверяет ему или не знает, с какой стороны подступиться к этому чуду.
Внимание: PowerShell вызывает привыкание.
Введение
Википедия говорит нам:
Windows PowerShell — расширяемое средство автоматизации от Microsoft, состоящее из оболочки с интерфейсом командной строки и сопутствующего языка сценариев.
Выглядеть среда PowerShell может так, как командная строка:
![](https://habrastorage.org/files/2e9/440/76b/2e944076b4dc40b89429367ebfb80af8.png)
powershell.exe
Или в виде приложения:
![](https://habrastorage.org/files/e5f/bec/a27/e5fbeca272e14f918aa13361c266ab27.png)
powershell_ise.exe
Powershell_ise.exe называется интегрированной средой сценариев — Windows PowerShell ISE. Позволяет работать с языком в удобной среде с подсветкой синтаксиса, конструктором команд, автозаполнением команд по нажатию TAB и прочими прелестями. Идеальна для создания и тестирования сценариев.
Для запуска среды powershell.exe или powershell_ise.exe достаточно набрать аналогичное название в строке выполнить.
![](https://habrastorage.org/files/e09/624/761/e09624761ee9494d8cfb25dfb0a8d850.png)
Файл сценария PowerShell имеет расширение .ps1.
![](https://habrastorage.org/files/82b/01b/c33/82b01bc332bd4295ab104b526890b6ff.png)
Сценарий не получится запустить двойным ЛКМ. Это сделано специально для того, чтобы не нанести вред системе случайно запущенным скриптом.
Для запуска, по клику ПКМ следует выбрать «Выполнить с помощью PowerShell»:
![](https://habrastorage.org/files/53e/d1c/de6/53ed1cde616e4e10be00c98fd80a6a0f.png)
Помимо того, что существует ограничение по запуску сценариев ЛКМ, по умолчанию выполнение сценариев в системе запрещено, опять же, по описанной выше причине — не нанести вред системе. Для проверки текущей политики выполнения выполним команду:
Get-ExecutionPolicy
![](https://habrastorage.org/files/46e/399/fc7/46e399fc77324041978b57310cfbc131.png)
Мы получим одно из следующих ниже значений. С большой вероятностью, если это был первый запуск, мы получим Restricted.
- Restricted — Сценарии не могут быть запущены;
- AllSigned — Могут быть запущены только сценарии, подписанные доверенным издателем. Перед выполнением сценария доверенного издателя будет запрашиваться подтверждение;
- RemoteSigned — Разрешено выполнять созданные нами сценарии и скачанные сценарии, подписанные доверенным издателем;
- Unrestricted — Никаких ограничений, все скрипты могут быть запущены.
Для выполнения и тестирования понизим политику до RemoteSigned выполнив команду:
Set-ExecutionPolicy RemoteSigned
![](https://habrastorage.org/files/285/fa8/3be/285fa83be2c140b0ba27be283af09700.png)
Приступаем к работе
Командлет
- Командлетами называются команды PowerShell, в которых заложена различная функциональность;
- Командлеты могут быть как системными, так и пользовательскими, созданные кем-либо;
- Командлеты именуются по правилу Глагол-Существительное, что упрощает их запоминание;
- Командлеты выводят результаты в виде объектов или их коллекций;
- Командлеты могут как получать данные для обработки, так и передавать данные по конвейеру (про конвейеры позже);
- Командлеты не чувствительны к регистру (можно написать и get-process, и Get-Process, и GeT-pRoCeSs);
- После командлетов не обязательно ставить ";", за исключением, когда мы выполняем несколько командлетов в одну строку (Get-Process; Get-Services).
Например, для получения текущих процессов, мы выполним команду:
Get-Process
И получим результат:
![](https://habrastorage.org/files/d44/79d/925/d4479d925d0d48789ebbd0b1ee6a987a.png)
Попробуйте самостоятельно выполнить:
Get-Service #для получения статуса служб, запущенных на компьютерах
Get-Content C:\Windows\System32\drivers\etc\hosts #для получения содержимого файла. В данном случае, файл hosts
Не обязательно знать наизусть все командлеты. Get-Help спасёт ситуацию.
Информацию о всех доступных командлетах можно получить, введя следующую команду:
Get-Help -Category cmdlet
Если мы используем PowerShell ISE, мы облегчаем процесс разработки.
Достаточно ввести знак тире "-" после того, как ввели командлет, и мы получим все возможные варианты параметров и их типы:
![](https://habrastorage.org/files/c8f/6d3/a65/c8f6d3a653fd492381e743556039cc57.jpg)
Попробуйте выполнить:
Get-Service -Name p*
Если, всё же, мы забудем какие свойства есть у того или иного командлета, прогоним его через Get-Member:
Get-Process | Get-Member
#Знак "|" называется конвейером. О нём ниже.
![](https://habrastorage.org/files/06d/c52/510/06dc52510ac246059cfecd8cb3a7a540.png)
Недостаточно информации? Обратимся к справке с параметром -Examples:
Get-Help Get-Process -Examples
Получаем описание Get-Process, да ещё и с примерами использования:
![](https://habrastorage.org/files/a5f/103/2c6/a5f1032c6cc947c6b845432903ea191b.png)
- Командлеты могут иметь сокращённые названия — алиасы. Например, вместо 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 бывают строчные — # и блочные — <#… #>:
![](https://habrastorage.org/files/269/ade/007/269ade0072c34614bfeca0a16344822d.png)
Обратим внимание, на код из примера:
Get-WmiObject -Class Win32_OperatingSystem | SELECT Caption
Для тех, кто знаком с WMI, кто делает это на старом добром VBScript, помните, сколько кода надо написать?
On Error Resume Next
strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2")
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
В примере мы используем $_. Данная запись означает текущий элемент в конвейере.
![](https://habrastorage.org/files/d62/d85/714/d62d8571425c48b480b73a47fa6319a8.png)
Послесловие
В этой части мы научились запускать PowerShell, разобрались с политикой выполнения сценариев. Поняли, что такое командлеты, знаем, как передавать их по конвейеру и как получить их свойства. Если мы что-то забудем, обязательно Get-Help.
Все это знания нужные для того, чтобы сделать первый прыжок в язык. Поверьте, ещё много интересного!
Продолжение следует...
Дополнительная информация
- Jump Start в PowerShell (часть II);
- Скачать PowerShell v.5 бесплатно без регистрации;
- Замечательный курс на MVA: Расширенные возможности и написание скриптов в PowerShell 3.0 (Jump Start). Мой совет — посмотрите первые 3 блока, окунитесь в язык, попробуйте повыполнять какие-нибудь задачи и через недельку смотрите оставшиеся блоки. Русские субтитры;
- Видео в тему на TechDays;
Галерея скриптов PowerShell на Technet;
Блог разработчиков PowerShell.