PowerShell для чайников: что это и как с ним работать
Рассказываем о языке программирования, с помощью которого можно творить чудеса в Windows (и не только).
Иллюстрация: Francesca Tosolini / Unsplash / Annie для Skillbox Media
Рядовые пользователи общаются со своими ПК через графический интерфейс: нажимают иконки и кнопки, переключаются между окнами и вкладками.
А системные администраторы используют для этого командную строку. Чтобы компьютер понимал их указания, интерпретатор, он же командная оболочка, переводит всё на машинный язык.
Есть десятки оболочек под разные нужды, предпочтения и операционные системы. В Linux обычно используют Bash, в macOS по умолчанию установлен Zsh, а для Windows (но не только) есть PowerShell.
Из статьи вы узнаете:
- Что такое Windows PowerShell
- Как открыть PowerShell в Windows
- Какие у неё есть команды (они же командлеты)
- Что такое объекты и конвейеры (пайплайны)
- Как запустить выполнение задач в фоновом режиме
- Как работать в PowerShell ISE
- О переменных
- О логических операторах
- Об условиях в Power Shell
- Как работать с циклами
- О массивах, хеш-таблицах, функциях и классах
Что такое Windows PowerShell
Windows PowerShell — это одновременно командная оболочка и язык сценариев, основанный на .NET. PowerShell используют для управления компьютером и автоматизации задач. Это полноценный объектно-ориентированный язык, в котором есть переменные, функции, классы и объекты.
В отличие от других командных оболочек, PowerShell работает не со строками, а с объектами. Благодаря этому можно создавать сложную логику. При этом интерпретатор полностью совместим со стандартными командами cmd.exe и может выполнять их.
Читайте также:
Команды пишут в интерактивном режиме внутри терминала. Но если вы хотите сохранить какой-то часто используемый скрипт, удобнее использовать ISE.
Windows PowerShell ISE — это интегрированная среда сценариев для PowerShell. В ней можно писать, сохранять и запускать скрипты, есть подсветка синтаксиса, автодополнение, справочник команд и инструменты отладки. PowerShell ISE — легаси-инструмент, он работает для версии языка 5.1 и ниже. Для более поздних обновлений используют IDE общего назначения с плагинами.
С 2016 года язык стал кросс-платформенным. Его можно использовать не только в Windows, но и в macOS (начиная с версии 10.13) и популярных дистрибутивах Linux (каких именно, можно узнать в документации).
Как открыть PowerShell в Windows
Обычно PowerShell предустановлен по умолчанию. Но если у вас его нет, можете воспользоваться инструкцией от Microsoft. Также в документации есть руководства по установке для macOS и Linux.
PowerShell не зависит от версии операционной системы и одинаково работает как на Windows 10, так и на Windows Server.
Есть два основных способа открыть PowerShell или PowerShell ISE в Windows: меню «Пуск» и приложение «Выполнить».
В меню «Пуск» долистайте до папки Windows PowerShell, откройте её и выберите нужное приложение. Здесь есть 32-разрядные (у них х86 в скобках) и 64-разрядные версии терминала и ISE.
Приложение «Выполнить» открывается сочетанием клавиш Win + R. В появившемся окне введите powershell или powershell ise (в зависимости от того, что вам нужно) и нажмите ОК.
Команды (командлеты) PowerShell
Команды в PowerShell называются командлетами (от английского cmdlet). Все они состоят из связки «Глагол-Существительное», или по-другому «Действие-Объект». Например, Get-Services и Start-Process. Благодаря такой структуре можно понять назначение команды, даже если вы с ней ещё не сталкивались.
Синтаксис командлетов
После самого командлета ему передаются параметры и их значения. Между всеми словами в команде ставится пробел. Вот пример синтаксиса команды, чтобы перейти в каталог C:\:
Препарируем её:
- Set-Location — буквально «установить местоположение». Переходит в нужный каталог.
- -LiteralPath C:\ — в этом параметре мы прописываем путь до каталога, в который хотим перейти. У командлета Set-Location это аргумент по умолчанию, поэтому -LiteralPath можно не прописывать отдельно: Set-Location C:\ -Passthru сработает точно так же.
- -PassThru — обычно командлет Set-Location просто меняет местоположение и ничего не возвращает. Этот параметр говорит, что нужно вывести на экран расположение каталога, в который мы перешли.
При этом в PowerShell не важен регистр. Эту же команду можно записать только заглавными буквами, только строчными и даже «лесенкой» — она всё равно сработает.
Если в одной строке написаны сразу несколько команд, они разделяются точкой с запятой ;.
Иногда команда может получиться слишком длинной. Чтобы разбить её на несколько строк, в месте переноса ставится гравис `. Создать новую строку можно сочетанием клавиш Shift + Enter (появится ниже текущей) или Ctrl + Enter (появится выше текущей).
Разделим предыдущую команду:
Совет
Стрелки вверх и вниз позволяют прокручивать историю команд, которые вы вводили. Это удобно, если нужно выполнить одну из предыдущих команд ещё раз или внести в неё небольшие изменения.
Алиасы
При работе с терминалом в интерактивном режиме бывает неудобно каждый раз вводить полные названия командлетов. Поэтому у самых распространённых есть псевдонимы, или алиасы, — их сокращённые версии.
Получить список доступных алиасов можно командой Get-Alias (у неё тоже есть свой псевдоним — gal).
Чтобы узнать список алиасов для отдельного командлета, воспользуйтесь параметром -Definition. Например:
Если вы по алиасу хотите узнать полное название командлета, примените параметр -Name. Это аргумент по умолчанию, поэтому писать его необязательно.
Особенности пути до каталога
Многим командлетам для работы нужно передать путь до файла или каталога. Делается это в виде строки, например: C:\Windows\System32.
Но если в этом адресе встретится пробел или другой спецсимвол, PowerShell воспримет его как разделитель. Например:
PowerShell «видит» пробел и думает, что путь до папки закончился на слове Program, а files — это уже значение какого-то другого параметра.
Есть два способа избежать таких ситуаций:
- Экранировать проблемные символы обратным грависом `: C:\Program` Files. Если путь длинный, то это может быть неудобно.
- Поместить весь путь в одинарные или двойные кавычки: 'C:\Program Files' или "C:\Program Files" (лучше одинарные).
Также в PowerShell есть сокращения для быстрого доступа к ближайшим директориям:
- Точка . указывает на текущий каталог. Например, Get-ChildItem . позволяет посмотреть все папки и файлы в нынешнем местоположении.
- Две точки .. указывают на родительский каталог. Например, Set-Location .. позволяет быстро к нему перейти. Это может быть полезно, если вы находитесь где-то в глубоко вложенной директории.
У многих командлетов есть сразу два параметра, в которых можно указать путь до папки или файла: -Path и -LiteralPath. Разница между ними в том, что в -Path можно подставлять переменные, а -LiteralPath воспринимает символы буквально, даже если в них указано имя переменной. О переменных в PowerShell мы рассказываем ниже.
Get-Help: как изучать новые командлеты
Чтобы узнать подробную информацию о командлете, используйте Get-Help Название-Командлета. Например:
У Get-Help есть несколько полезных параметров:
- -Detailed даёт более детальную справку.
- -Full даёт полную справку.
- -Examples приводит примеры использования командлета.
- -Online перенаправляет на веб-страницу с документацией.
Объекты и конвейеры (пайплайны)
Командлеты PowerShell возвращают в терминал не строки, а объекты — структуру данных с набором свойств и методов. Подробно об объектах можно прочитать в нашей статье.
Строка, которую вы видите в терминале после выполнения команды — только визуальное представление объекта. PowerShell в виде таблицы показывает некоторые свойства, но не все.
Так же, как командлеты возвращают объекты, они могут принимать и обрабатывать их. Можно написать команду, на выходе получить объект, передать его другому командлету, получить объект уже от него, передать — и так до бесконечности. Это и есть конвейеры, или пайплайны.
Чтобы передать результат командлета другому командлету, между ними ставят вертикальную черту |.
Работа конвейера на примере
Get-Process возвращает список процессов, запущенных на компьютере. Если передать ему название процесса (или шаблон, написанный с помощью регулярных выражений), командлет выведет только нужные элементы списка.
Вызовем запущенный процесс powershell.
Мы получили объект и таблицу с некоторыми его свойствами. Чтобы узнать все свойства и методы, передадим объект командлету Get-Member. Для этого нам и понадобится конвейер.
Get-Member получил объект от Get-Process и вывел таблицу со всем его содержимым. Результат работы Get-Member — тоже объект (вернее, список объектов), который можно передать по конвейеру дальше.
Например, мы хотим отобразить только те строки, в которых MemberType — это Property. Для этого используем командлет Where-Object.
Where-Object по очереди перебирает каждый объект, полученный от Get-Member. Выражение в фигурных скобках — логическое:
- $_ ссылается на текущий объект (то есть на отдельную строку в таблице);
- .MemberType обращается к значению свойства MemberType в этом объекте;
- -eq сравнивает, равно ли выражение слева от него выражению справа от него;
- 'Property' — это значение, которое мы ожидаем увидеть у свойства MemberType.
О логических выражениях мы рассказываем ниже.
Форматирование таблиц с помощью конвейеров
Командлет Format-Table позволяет настроить отображение таблицы, которую PowerShell выводит в терминале: выбрать свойства и методы, которые в ней будут, установить ширину столбцов, сгруппировать данные по нескольким таблицам и так далее.
Отформатируем таблицу, которую получили от командлета Get-Member.
Расшифруем параметры Format-Table:
- -AutoSize выравнивает ширину столбцов по размеру их содержимого;
- -Wrap переносит содержимое ячейки на следующую строку, если она не помещается в размеры экрана (по умолчанию текст обрезается);
- -GroupBy разделяет одну таблицу на несколько, сгруппированных по значению какого-либо свойства (в нашем случае для каждого MemberType создана отдельная таблица);
- -Property указывает, какие свойства объекта будут отображаться в таблице в качестве столбцов (в нашем случае Name и Definition).
Сортировка таблиц с помощью конвейеров
Командлет Sort-Object позволяет отсортировать список объектов (то есть таблицу) по значениям её свойств (то есть столбцов). Отсортируем результат работы GetMember по столбцу Name в алфавитном порядке. Для этого используем параметр -Property (работает как у Format-Table).
У Sort-Object есть и другие полезные параметры:
- -Descending сортирует объекты в порядке убывания.
- -Unique удаляет дубликаты и возвращает только уникальные объекты.
- -Top получает число N и отображает первые N объектов в таблице.
- -Bottom получает число N и отображает последние N объектов в таблице.
Фоновое выполнение команд
Некоторые задачи могут занимать много времени. Это, например, установка и обновление ПО, поиск файла в большой директории. Пока PowerShell выполняет одну команду, писать другие нельзя.
К примеру, попытаемся найти на всём диске C файл powershell.exe. Используем для этого командлет Get-ChildItem с параметром -Recurse. Так он будет искать не только в текущем каталоге, но и во всех подкаталогах.
PowerShell может попытаться зайти в папки, к которым у него нет доступа, поэтому добавим -ErrorAction SilentlyContinue. Если случится ошибка, команда не станет сообщать об этом и просто продолжит выполняться.
Получается так:
Как видим, пока задача не завершена, командная строка недоступна. Чтобы принудительно прервать её выполнение, нажмите сочетание клавиш Ctrl + C (при этом ничего не должно быть выделено, иначе компьютер воспримет это как команду «Копировать»).
Чтобы не ждать выполнения долгих задач и сразу приступать к следующим, их можно запускать в фоновом режиме. Делается это командлетом Start-Job, а сама команда помещается в фигурные скобки.
Одновременно можно выполнять любое количество фоновых задач. Помимо Start-Job для работы с фоновыми задачами есть другие командлеты:
- Get-Job выдаёт отчёт со статусом фоновых задач.
- Wait-Job делает консоль недоступной, пока выполняется фоновая задача.
- Stop-Job прерывает выполнение фоновой задачи.
- Receive-Job выводит результат фоновой задачи и удаляет его из памяти. Чтобы сохранить результат в памяти, используйте параметр -Keep.
Wait-Job, Stop-Job и Receive-Job ожидают, что вы примените их к конкретной задаче (или нескольким). Для этого укажите название Name или идентификатор Id. Делать это можно и в связке с Get-Job.
Работа в PowerShell ISE
Терминал PowerShell удобен для выполнения небольших коротких однострочных задач. Чтобы создавать и сохранять сложные скрипты, есть интегрированная среда сценариев.
Важно!
PowerShell ISE предназначен для версий языка 5.1 и младше. Для более старших версий Microsoft рекомендует использовать Visual Studio Code с расширением PowerShell.
PowerShell ISE состоит из трёх основных окон:
- область сценариев в верхней части экрана — в ней пишут скрипты;
- область консоли в нижней части экрана — работает так же, как обычный терминал, здесь можно писать команды в интерактивном режиме;
- панель команд в правой части экрана — полный справочник команд PowerShell с конструктором, в котором можно указать значения нужных параметров.
Комментарии в коде
PowerShell позволяет вставлять в код комментарии. Они никак не влияют на выполнение скрипта и нужны людям, которые будут читать вашу программу. Однострочный комментарий начинается с символа #, а многострочный обрамляется с двух сторон символами <# и #>.
Правила хорошего кода
Любой код чаще читают, чем пишут, и важно делать его понятным для человека. Разработчики PowerShell договорились между собой о едином своде правил и выпустили стайлгайд. Вот несколько правил оттуда.
Используйте нотацию PascalCase в названиях командлетов, функций, параметров, свойств, методов, переменных и классов. Неправильно писать: get-service, Get-service, GET-SERVICE. Правильно: Get-Service.
Пишите полные названия командлетов. Алиасы удобны для работы в интерактивном режиме, но в скриптах могут затруднять чтение команд. Неправильно: dir, gci, ls. Правильно: Get-ChildItem.
One True Brace Style при оформлении вложенности. Если вы где-то используете фигурные скобки, то код внутри них отбивается табуляцией (четыре пробела), а сами скобки ставятся так:
Исключение из прошлого правила — когда код в фигурных скобках совсем небольшой, его можно записать в одну строку. Например:
Комментируйте код. Так будет гораздо проще разобраться, что он делает и как работает. Причём как другому человеку, так и вам самим через полгода.
Запуск скриптов
В PowerShell ISE можно выполнить код целиком или частично, есть инструменты отладки. Скрипты сохраняются в файлах с расширением .ps1. Но запустить их двойным кликом не получится — нужно нажать правую кнопку мыши и в появившемся окне выбрать Выполнить с помощью PowerShell.
Также запустить скрипт можно из оболочки. Например, в каталоге C:\Scripts есть файл test_script.ps1. Выполнить его можно:
- командой PowerShell -File C:\Scripts\test_script.ps1, запущенной из любого места;
- командой .\test_script.ps1, запущенной, когда вы находитесь в каталоге C:\Scripts.
Политика выполнения
По умолчанию запускать любые файлы с PowerShell-скриптами запрещено. Сделано это в целях безопасности. Узнать нынешнюю политику выполнения можно с помощью командлета Get-ExecutionPolicy. Вот какая она может быть:
- Restricted (установлена по умолчанию) — запрещено запускать любые скрипты.
- AllSigned — разрешено запускать только скрипты, которые были подписаны доверенным разработчиком.
- RemoteSigned — разрешено запускать подписанные доверенным разработчиком и собственные скрипты.
- Unrestricted — разрешено запускать любые скрипты.
Чтобы ваши ps1-файлы запускались, нужно заменить политику выполнения на RemoteSigned. Для этого откройте PowerShell от имени администратора и выполните команду:
Чтобы подтвердить действие, введите y.
Переменные
Чтобы сохранять данные и обращаться к ним в будущем, в PowerShell есть переменные. Перед их названием ставится знак доллара $, а сами они могут содержать латинские буквы (заглавные и строчные), цифры и нижние подчёркивания.
Переменная может хранить данные любого типа, и их можно перезаписывать.
Переменную можно привести к определённому типу данных. Создадим переменную со строкой 2023 и преобразуем её в число. Чтобы узнать тип данных, воспользуемся методом .GetType().
Чтобы удалить переменную, используется метод .Clear().
Переменные можно подставлять в строки, если они оформлены двойными кавычками. Если же кавычки одинарные, то PowerShell воспринимает символы в строке буквально. Сравните:
Помимо пользовательских также есть системные переменные. Например, $PSVersionTable хранит информацию о версии PowerShell.
Логические операторы
PowerShell позволяет проводить с объектами арифметические операции и сравнивать их друг с другом. Для этого он использует логические операторы.
Арифметические операторы:
- + — сложение;
- - — вычитание;
- * — умножение;
- / — деление;
- % — деление по модулю;
- ( и ) — скобки для группировки операций.
Операторы сравнения оформляются так же, как параметры командлетов. Их названия произошли от английских выражений, указанных в скобках.
- -eq — равно (от equal);
- -ne — не равно (от not equal);
- -gt — больше (от greater than);
- -ge — больше либо равно (от greater than or equal);
- -lt — меньше (от less than);
- -le — меньше либо равно (от less than or equal).
Условия
Условия в PowerShell создаются с помощью ключевых слов if, elseif и else. В обычных скобках указывается само условие, в фигурных — код, который запускается при его выполнении. Например:
Также условия можно задавать с помощью ключевого слова switch. Например:
Циклы
В PowerShell есть сразу несколько видов циклов:
- с предусловием (while);
- с постусловием истинным (do while) и ложным (do until);
- с заранее известным числом итераций (for);
- с перебором элементов коллекции (foreach).
Их синтаксис похож на синтаксис условий: в круглых скобках указывается условие, в фигурных — блок кода.
Массивы, хеш-таблицы, функции и классы
PowerShell позволяет создавать и более сложные структуры данных и алгоритмы. Прочитать о них можно в документации PowerShell:
Резюмируем
Windows PowerShell — язык программирования, на котором администрируют операционные системы и автоматизируют процессы. Он поддерживает объектно-ориентированное программирование и позволяет работать в интерактивном режиме, а также писать, сохранять и выполнять полноценные скрипты.
- PowerShell предустановлен в Windows, но его можно скачать на macOS и Linux.
- У языка есть собственная интегрированная среда сценариев PowerShell ISE, предназначенная для старых версий языка (5.1 и ниже).
- PowerShell работает не со строками, а с объектами. Он обрабатывает их с помощью командлетов, построенных по принципу «Глагол-Существительное».
- Результат выполнения одного командлета можно передавать другому в конвейере.
- Задачи можно выполнять в фоновом режиме.
- PowerShell — высокоуровневый язык, на котором можно работать с переменными, логическими операторами, условиями, циклами, массивами, хеш-таблицами, функциями и классами.
Больше интересного про код — в нашем телеграм-канале. Подписывайтесь!