- PVSM.RU - https://www.pvsm.ru -
Только автоматизация. Только 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.
Для выполнения и тестирования понизим политику до RemoteSigned выполнив команду:
Set-ExecutionPolicy RemoteSigned

Например, для получения текущих процессов, мы выполним команду:
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, да ещё и с примерами использования:

Попробуйте выполнить:
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.
Все это знания нужные для того, чтобы сделать первый прыжок в язык. Поверьте, ещё много интересного!
P.S. Жаль, что на Хабре не добавлен синтаксис PowerShell.
Автор: bgelov
Источник [5]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/programmirovanie/73648
Ссылки в тексте:
[1] Скачать PowerShell v.4 бесплатно без регистрации: http://www.microsoft.com/ru-ru/download/details.aspx?id=40855
[2] Расширенные возможности и написание скриптов в PowerShell 3.0 (Jump Start): http://www.microsoftvirtualacademy.com/training-courses/advanced-tools-and-scripting-with-powershell-3-jump-start-russian
[3] Галлерея скриптов PowerShell на Technet: https://gallery.technet.microsoft.com/scriptcenter/site/search?f%5B0%5D.Type=ProgrammingLanguage&f%5B0%5D.Value=PowerShell&f%5B0%5D.Text=PowerShell
[4] Блог разработчиков PowerShell: http://blogs.msdn.com/b/powershell/
[5] Источник: http://habrahabr.ru/post/242425/
Нажмите здесь для печати.