Что такое Windows PowerShell и с чем его едят? Часть 2: введение в язык программирования
Для PowerShell можно писать сценарии на интерпретируемом мультипарадигменном языке, в котором есть элементы классического процедурного, объектно-ориентированного и даже функционального программирования: условный переход, циклы, переменные, массивы, хэш-таблицы, классы, обработка ошибок, а также функции, командлеты и конвейеры. Предыдущая статья была посвящена основам работы в среде, а сейчас мы предлагаем вниманию читателей небольшой справочник для программистов.
Оглавление:
Писать код можно в любом текстовом редакторе или с использованием интегрированной среды разработки — проще всего взять Windows PowerShell ISE из комплекта поставки серверных операционных систем Microsoft. Нужно это только для достаточно сложных скриптов: короткие наборы команд проще выполнять в интерактивном режиме.
Комментарии
Использование комментариев считается частью хорошего стиля программирования наряду с правильными отступами и пробелами:
Переменные и их типы
Переменные в PowerShell — это именованные объекты. Их названия могут включать символ подчеркивания, а также буквы и числа. Перед именем всегда используется символ $, а чтобы объявить переменную, достаточно указать интерпретатору допустимое имя:

Для инициализации переменной (присвоения ей значения) применяется оператор присваивания (символ =):
Объявить переменную можно с указанием ее типа в квадратных скобках (оператор приведения типов) перед именем или значением:
Важно понимать, что переменные в PowerShell — это полноценные объекты (классы) со свойствами и методами, типы которых основаны на имеющихся в .NET Core. Перечислим основные:
| Тип (класс .NET) | Описание | Пример кода |
|---|---|---|
| [string] System.String |
строка Unicode | $test = «тест» $test = ‘тест’ |
| [char] System.Char |
символ Unicode (16 бит) | [char]$test = ‘c’ |
| [bool] System.Boolean |
булевский тип (логическое значение True или False) | [bool]$test = $true |
| [int] System.Int32 |
тридцатидвухразрядное целое число (32 бита) | [int]$test = 123456789 |
| [long] System.Int64 |
шестидесятичетырехразрядное целое число (64 бита) | [long]$test = 12345678910 |
| [single] System.Single |
число с плавающей точкой длиною в 32 бита | [single]$test = 12345.6789 |
| [double] System.Double |
число с плавающей точкой длиною в 64 бита (8 байт) | [double]$test = 123456789.101112 |
| [decimal] System.Decimal |
число с плавающей точкой длиною в 128 бит (обязательно указывать d на конце) | [decimal]$test = 12345.6789d |
| [DateTime] System.DateTime |
дата и время | $test = Get-Date |
| [array] System.Object[] |
массив, индекс элементов которого начинается с 0 | $test_array = 1, 2, «тест», 3, 4 |
| [hashtable] System.Collections.Hashtable |
хэш-таблицы — ассоциативные массивы с именованными ключами, построенные по принципу: @<ключ = «значение»> | $test_hashtable = @ |
PowerShell поддерживает неявное преобразование типов, кроме того тип переменной может меняться на ходу (например, при помощи оператора присваивания), если он не указан принудительно — в этом случае интерпретатор выдаст ошибку. Определить тип переменной из предыдущего примера можно при помощи вызова метода GetType():

Существует некоторое количество командлетов для управления переменными. Их список в удобной форме выводится с помощью команды:

Для просмотра объявленных переменных и их значений можно использовать специальный командлет:
Такой способ кажется чрезмерно громоздким, с переменными намного удобнее работать через операторы или обращаясь к их свойствам и методам напрямую. Тем не менее командлеты имеют право на существование, поскольку позволяют задать некоторые дополнительные параметры. Важно понимать, что пользовательские переменные определены только в рамках текущего сеанса. После закрытия консоли или завершения сценария они удаляются.
Системные переменные
Помимо объявленных пользователем существуют встроенные (системные) переменные, которые не удаляются после завершения текущего сеанса. Делятся они на два типа, при этом данные о состоянии PowerShell хранятся в автоматических переменных, которым нельзя самостоятельно присвоить произвольные значения. К их числу относится, например, $PWD:

Для хранения пользовательских настроек нужны переменные предпочтений, значения которых можно изменить. К примеру, с помощью $ErrorActionPreference задается реакция интерпретатора команд на возникновение некритических ошибок.
Вдобавок к операторам и командлетам для обращения к объявленным переменным существует псевдонакопитель Variable:. Работать с ним можно по аналогии с другими накопителями, а переменные в этом случае напоминают объекты файловой системы:

Области видимости
Для переменных в PowerShell существует понятие области видимости (Scope). Действие глобальной области (Global) распространяется на весь текущий сеанс — в нее входят, например, системные переменные. Локальные (Local) переменные доступны только в области, где они были определены: скажем внутри функции. Есть еще понятие области действия сценария (Script), но для команд скрипта она по сути является локальной. По умолчанию при объявлении переменных им задается локальная область действия, а чтобы это изменить, нужна специальная конструкция вида: $Global: переменная = значение.
Переменные окружения (среды)
Из PowerShell доступен еще один псевдонакопитель Env:, с помощью которого можно обратиться к переменным среды. При запуске оболочки они копируются из родительского процесса (т.е. из инициировавшей текущий сеанс программы) и обычно их первоначальные значения совпадают со значениями в панели управления. Для просмотра переменных окружения используется командлет Get-ChildItem или его псевдонимы (алиасы): ls и dir.

Эти переменные представляют собой последовательности байтов (или символов, если угодно), интерпретация которых зависит только от использующей их программы. Командлеты *-Variable с переменными среды не работают. Чтобы обратиться к ним, придется использовать префикс диска:

Арифметические операторы и операторы сравнения
| Оператор | Описание | Пример кода |
|---|---|---|
| -eq | Equal / Равно (аналог = или == в других языках) | $test = 100 $test -eq 123 |
| -ne | Not equal / Не равно (аналог <> или !=) | $test = 100 $test -ne 123 |
| -gt | Greater than / Больше (аналог >) | $test = 100 $test -gt 123 |
| -ge | Greater than or equal / Больше или равно (аналог >=) | $test = 100 $test -ge 123 |
| -lt | Less than / Меньше (аналог <) | $test = 100 $test -lt 123 |
| -le | Less than or equal / Меньше или равно (аналог <=) | $test = 100 $test -le 123 |
Существуют и другие подобные операторы, позволяющие, например, сравнивать строки с учетом символа подстановки или использовать регулярные выражения для поиска соответствия образцу. Их мы подробно рассмотрим в следующих статьях. Символы <, > и = для сравнения не используются, поскольку задействованы для других целей.
Операторы присваивания
Помимо самого распространенного оператора = существуют и другие операторы присваивания: +=, -=, *=, /= и %=. Они изменяют значение перед присвоением. Аналогично ведут себя унарные операторы ++ и —, которые увеличивают или уменьшают значение переменной — они тоже относятся к операторам присваивания.
Логические операторы
Для описания сложных условий одного только сравнения недостаточно. Записать любые логические выражения можно с помощью операторов: -and, -or, -xor, -not и. Работают они как и в других языках программирования, при этом можно использовать круглые скобки, чтобы задать порядок вычисления:
Условный переход
Операторы ветвления в PowerShell стандартные: IF(IF…ELSE, IF…ELSEIF…ELSE) и SWITCH. Рассмотрим их использование на примерах:
Циклы
В языке PowerShell есть несколько разновидностей циклов: WHILE, DO WHILE, DO UNTIL, FOR и FOREACH.
Цикл с предусловием работает, если/пока оно выполняется:
Циклы с постусловием отработают хотя бы один раз, потому что проверка условия производится после выполнения итерации. При этом DO WHILE работает, пока условие истинно, а DO UNTIL — пока оно ложно:
Количество итераций цикла FOR известно заранее:
В цикле FOREACH осуществляет перебор элементов массива или коллекции (хэш-таблицы):
Массивы
В переменных PowerShell хранятся не только единичные объекты (число, строка и т.д.), но и множественные. Самая простая разновидность таких переменных — массивы. Массив может состоять из нескольких элементов, из одного элемента или быть пустым, т.е. не содержать элементов. Для его объявления используется оператор @(), который понадобится нам в следующей статье — он очень важен для добавления в массив других массивов (создания многомерных массивов), передачи массивов в функции в качестве аргумента и тому подобных задач:
При инициализации массива его значения перечисляются через запятую (специальный оператор ,):
В большинстве случаев оператор @() можно опустить:
В этом случае массив из одного элемента инициализируется следующим образом
Для обращения к элементам массива используется начинающийся с нуля целочисленный индекс и оператор индекса (квадратные скобки):
Можно указать несколько индексов через запятую, в т.ч. повторяющихся:

Оператор .. (две точки — оператор диапазона) возвращает массив целых чисел на определенном верхней и нижней границей отрезке. Например, выражение 1..4 выводит массив из четырех элементов @(1, 2, 3, 4), а выражение 8..5 — массив @(8, 7, 6, 5).

С помощью оператора диапазона можно инициализировать массив ($test_array = 1..4) или получить срез (slice), т.е. последовательность элементов одного массива с индексами из другого. При этом отрицательное число -1 обозначает последний элемент массива, -2 — предпоследний и т.д.
Обратите внимание, что значения целочисленного массива могут быть больше максимального значения индекса массива с данными. В этом случае возвращаются все значения до последнего:
Если попытаться обратиться к единственному несуществующему элементу массива, возвращается значение $null.

В PowerShell массивы могут содержать элементы разных типов или быть строго типизированными:
Где свойство $test_array.count — количество элементов массива.
Пример создания строго типизированного массива:
Хэш-таблицы
Еще один базовый тип переменных в языке PowerShell — хэш-таблицы, которые также называют ассоциативными массивами. Hashtable похожи на JSON object и строятся по принципу ключ-значение. В отличие от обычных массивов, доступ к их элементам осуществляется по именованным ключам, которые являются свойствами объекта (также можно использовать оператор индекса — квадратные скобки).
Пустая хэш-таблица объявляется с помощью служебного символа @ и операторных скобок:
При объявлении можно сразу создать ключи и присвоить им значения:
Для добавления элемента в хэш-таблицу нужно присвоить ей еще несуществующий ключ или воспользоваться методом Add(). Если присваивание делается с существующим ключом, его значение изменится. Для удаления элемента из хэш-таблицы используется метод Remove().

Переменные этого типа можно передавать в качестве аргументов функциям и командлетам — в следующей статье мы изучим как это делается, а также рассмотрим еще один сходный тип — PSCustomObject.
Функции
В языке PowerShell есть все необходимые для процедурного программирования элементы, включая функции. Для их описания используется служебное слово Function, после которого требуется указать имя функции и заключенное в операторные скобки тело. При необходимости передать в функцию аргументы их можно указать сразу после имени в круглых скобках.
Функция всегда возвращает результат — это массив результатов всех ее стейтментов, если их более одного. Если стейтмент один, возвращается единственное значение соответствующего типа. Конструкция return $value добавляет элемент со значением $value к массиву результатов и прерывает выполнение statement list, а пустая функция возвращает $null.
Для примера создадим функцию возведения числа в квадрат:
Отметим, что в теле функции можно использовать любые объявленные до ее вызова переменные, а вызов функций в PowerShell может показаться непривычным: аргументы (если они есть) не заключаются в круглые скобки и разделяются пробелами.
Из-за способа передачи аргументов саму функцию иногда приходится заключать в скобки:

При описании функции можно присвоить аргументам значения по умолчанию:
Существует и другой синтаксис для описания аргументов функции, кроме того параметры могут считываться из конвейера — все это пригодится в следующей статье, когда мы будем рассматривать экспортируемые модули и создание собственных командлетов.
Обработка ошибок
В PowerShell существует механизм Try…Catch…Finally, позволяющий обрабатывать исключительные ситуации. В блок Try помещается код, в котором может возникнуть ошибка, а в блок Catch — ее обработчик. Если ошибки не было, он не выполняется. Блок Finally выполняется после блока Try вне зависимости от возникновения ошибки, а блоков Catch может быть несколько для исключений различных типов. Само исключение записывается в не требующую объявления переменную по умолчанию ($_) и может быть легко извлечено. В примере ниже мы реализуем защиту от ввода некорректного значения:

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

Шпаргалка по PowerShell — это версия языка командной строки Windows, которая помогает вам легко выполнять и автоматизировать критически важные задачи в ваших системах. Но как выполнять эти задачи и максимально использовать PowerShell в своей системе Windows?
Мы составили шпаргалку по PowerShell, в которой описаны синтаксис PowerShell и все команды PowerShell, чтобы помочь вам оптимизировать PowerShell и даже подготовиться к собеседованиям.
Шпаргалка по PowerShell
Начнем с краткого введения в команды Windows 10 PowerShell.
Основы PowerShell
PowerShell — это кроссплатформенное и широко используемое решение для автоматизации задач, сочетающее в себе возможности оболочки командной строки, языка сценариев и структуры управления конфигурацией. PowerShell можно запускать на операционных системах Windows, Linux и macOS. В отличие от других доступных оболочек, которые только принимают и возвращают данные, PowerShell принимает и возвращает объекты .NET.
Эта оболочка имеет следующие возможности.
- Удобная история командной строки
- Широкие возможности, такие как завершение табуляции и предсказание команд
- Псевдонимы команд и параметров
- Система изменения команд
- Встроенная справочная система, подобная Unix man pages
Учитывая возможности любого языка сценариев, вы можете использовать PowerShell для автоматизации процессов и задач управления системой. Он позволяет создавать, тестировать и развертывать решения в средах CI/CD.
PowerShell построен на базе .NET Common Language Runtime (CLR), что означает, что все входные и выходные данные являются объектами .NET. Вам не придется разбирать текстовый вывод, чтобы получить из него информацию.
Язык сценариев PowerShell обладает следующими возможностями.
- Функции, классы, объекты и модули
- Простая система форматирования для обеспечения четкого вывода данных для повышения удобочитаемости
- Встроенная поддержка различных форматов данных, таких как CSV, JSON и XML
- Система типов для создания динамических типов
Теперь перейдем к некоторым полезным командам PowerShell.
Шпаргалка PowerShell по командам
Командлеты
Cmdlets — это внутренние команды PowerShell. Эти команды возвращают один или несколько объектов в конвейер, в конце которого мы упоминаем некоторые свойства объектов в следующей таблице, чтобы увидеть их значения, отображаемые на экране.
| Команда | Описание |
| Эта команда позволяет получить поддержку с помощью PowerShell. | |
| Эта команда предлагает вам список доступных PSDrives, таких как c, env, hklm, hkcu, alias и т.д. | |
| В любом реестре дочерние ключи — это подключи текущего ключа. Чтобы получить необходимые сведения, можно воспользоваться следующей командой. | |
| Выполните эту команду, чтобы рекурсивно перечислить все дочерние элементы текущего PSdrive, папки или ключа реестра. | |
| Используйте эту команду для включения скрытых папок (каталогов). | |
| Выполните любую из этих команд, чтобы получить список имен файлов и каталогов в текущей папке. | |
| Используйте эту команду, чтобы получить количество записей в коллекции объектов, возвращенных командой Get-Children. |
PSdrives
PSdrives — это коллекция объектов, сгруппированных вместе, чтобы к ним можно было получить доступ как к диску файловой системы. PSprovider» выполняет эту группировку.
По умолчанию сеанс PS может обращаться к нескольким PSdrives, включая c:, env:, alias: и HKLM:, где c: означает обычный диск c Windows; env: — это пространство переменных среды Windows; alias: — это коллекция псевдонимов команд; а HKLM — это ветка в реестре.
При любом сеансе PS пользователь попадает в свою домашнюю папку. Если вы хотите перейти из сеанса PS на другой диск PSdrive и получить информацию с этого диска, воспользуйтесь следующими командами:
Конвейеры
Cmdlets использует конвейеры для передачи объектов, но не потоков символов, как Unix. Символ конвейера — | (ASCII 124), за которым следует команда, обрабатывающая вывод, проходящий через конвейер. Конвейер состоит из следующих трех этапов.
В следующей таблице приведены некоторые из основных команд конвейеров:
| Команда | Описание |
| Легко устанавливает значение свойства ‘lastwritetime.year’ на текущую дату и время, не влияя на содержимое файла. | |
| Предоставляет пустой результат | |
| Изменяет старые имена файлов и расширения файлов на новые | |
| Тривиальная команда переименования, вызывающая автоматическую переменную | |
| Если у передаваемого объекта $_ нет свойства (name), вы получите ошибку, так как параметр $_.name является null | |
| Отображает список имен всех файлов, присутствующих в текущей папке, отсортированных в алфавитном порядке. | |
| Перемещает все файлы в подкаталог папки | |
| Выдает сообщение об ошибке, что Move-Item не имеет входа |
Alias (Алиас)
Cmdlets поддерживают несколько псевдонимов. В следующей таблице приведены некоторые псевдонимы и их описания:
| Команда | Описание |
| Добавляет значение к файлу | |
| Поиск содержимого файла в массиве | |
| Изменение папки, ключа или диска PS | |
| Очищает консоль | |
| Удаление файлов | |
| Списки папок, ключей или дочерних элементов PSDrive | |
| Отправляет массив в консоль, конвейер или перенаправляет его в файл | |
| Обход каждого объекта в конвейере | |
| Форматирует таблицу с выбранными свойствами для каждого объекта в каждом столбце | |
| Форматирует свойства процесса по имени | |
| Обеспечивает псевдоним командлета | |
| Предоставляет вам команды только из текущей сессии | |
| Извлечение всех членов объекта | |
| Предоставляет свойства указанного элемента | |
| Получает текущее значение для указанного свойства при использовании параметра name | |
| Находит имена переменных сеансов | |
| Создает новый файл, каталог, символическую ссылку, ключ реестра или запись реестра. | |
| Выдает полный список всех запущенных процессов | |
| Предоставляет местоположение текущего каталога или ключа реестра | |
| Переименовывает старое имя элемента в новое имя | |
| Удаляет указанный каталог, файлы или ключи реестра | |
| Удаляет указанную переменную | |
| Приостанавливает деятельность на определенный период времени |
Операторы
Арифметические операторы
Приоритет оператора
| Приоритет | Оператор | Описание |
| 1 | () | Круглые скобки |
| 2 | — | Для отрицательного числа или унарного оператора |
| 3 | *, /, % | Для умножения и деления |
| 4 | +,- | Для сложения и вычитания |
| 5 | -band, -bnot, -bor, -bxor, -shr, and -shl | Для побитовых операций |
Операторы присваивания
| Оператор | Описание |
| = | Устанавливает значение переменной на указанное значение |
| += | Увеличивает значение переменной на указанное значение или добавляет указанное значение к существующему значению |
| -= | Уменьшает значение переменной на заданную величину |
| *= | Умножает значение переменной на указанное значение или добавляет указанное значение к существующему значению |
| /= | Делит значение переменной на заданное значение |
| %= | Делит значение переменной на заданное значение, а затем присваивает переменной остаток (модуль). |
| ++ | Увеличивает значение переменной, присваиваемого свойства или элемента массива на 1. |
| — | Уменьшает значение переменной, присваиваемого свойства или элемента массива на 1. |
Операторы сравнения
| Тип | Оператор | Сравнительный тест |
| Равенство | -eq | равно |
| -ne | не равно | |
| -gt | больше, чем | |
| -ge | больше или равно | |
| -lt | меньше чем | |
| -le | меньше чем или равно | |
| Соответствие | -like | строка соответствует шаблону подстановки |
| -notlike | строка не соответствует шаблону | |
| -match | строка соответствует regex-шаблону | |
| -notmatch | строка не соответствует regex-шаблону | |
| Замена | -replace | заменяет строки, соответствующие шаблону regex |
| Сдерживание | -contains | коллекция содержит значение |
| -notcontains | коллекция не содержит значения | |
| -in | значение находится в коллекции | |
| -notin | значение отсутствует в коллекции | |
| Тип | -is | оба объекта имеют одинаковый тип |
| -isnot | объекты разного типа |
Логические операторы
Оператор перенаправления
| Оператор | Описание | Синтаксис |
| > | Отправить указанный поток в файл | n> |
| >> | Добавить указанный поток в файл | n>> |
| >&1 | Перенаправляет указанный поток на поток Success | n>&1 |
Операторы типа
Другие операторы
| Оператор | Описание |
| () Оператор группировки | Позволяет переопределить старшинство операторов в выражениях |
| &() Оператор подвыражения | Выдает результат одного или нескольких утверждений |
| @( ) Оператор подвыражения массива | Возвращает результаты одного или нескольких операторов в виде массивов. |
| & Фоновый оператор | Конвейер перед & выполняется этой командой в задании Powershell. |
| [] Cast оператор | Преобразует объекты к определенному типу. |
Регулярные выражения
Регулярное выражение — это шаблон, который используется для сопоставления текста, включающего литеральные символы, операторы и другие конструкции. Регулярные выражения PowerShell по умолчанию не чувствительны к регистру.
| Метод | Чувствительность к случаю |
| Select-String | use -CaseSensitive switch |
| switch statement | use the -casesensitive option |
| operators | prefix with ‘c’ (-cmatch, -csplit, or -creplace) |
Литералы символов
Регулярное выражение может быть литеральным символом или строкой.
Группы символов
Они позволяют сопоставить любое количество символов за один раз, в то время как [^character group] сопоставляет только символы, не входящие в группу.
Диапазон символов
Шаблон также может быть диапазоном символов. Символы могут быть алфавитными [A-Z], цифровыми [0-9] или даже [ —
] (все печатаемые символы) в формате ASCII.
Числа
Класс символов \d будет соответствовать любой десятичной цифре. И наоборот, \D будет соответствовать любой недесятичной цифре.
Словесный символ
Класс символов \w будет соответствовать любому символу слова [a-zA-Z_0-9]. Чтобы подобрать любой несловосочетаемый символ, используйте \W.
Подстановочный знак
Точка (.) является символом подстановки в регулярных выражениях. Он будет соответствовать любому символу, кроме новой строки (\n).
Пробел
Пробельные символы сопоставляются с помощью класса символов \s. Любой не пробельный символ сопоставляется с помощью \S. Буквальные символы пробела ‘ ‘ также могут быть использованы.
Экранирование символов
Обратная косая черта (\) используется для экранирования символов, чтобы механизм регулярных выражений не разбирал их.
Следующие символы зарезервированы: []().\^$|?*+<>.
Подстановка в регулярном выражении.
Регулярные выражения с оператором -replace позволяют динамически заменять текст с помощью захваченного текста.
<input> -replace <original>, <substitute>
Управление потоком
ForEach-Object
ForEach-Object — это командлет, который позволяет выполнять итерации по элементам в конвейере, например, с помощью однострочных команд PowerShell. ForEach-Object будет передавать объекты по конвейеру.
Хотя параметр Module команды Get-Command принимает несколько значений, которые являются строками, он будет принимать их только через конвейерный ввод с помощью имени свойства или ввода параметра.
Если вы хотите передать две строки по значению в Get-Command для использования с параметром Module, используйте команду ForEach-Object:
For
Цикл «for» выполняет итерации, пока заданное условие истинно.
Do
В PowerShell существует два различных цикла «do». Do Until выполняется, пока заданное условие ложно.
Пример 1:
Пример 2:
While
Подобно циклу Do While, цикл While выполняется до тех пор, пока заданное условие истинно. Однако разница заключается в том, что цикл While оценивает условие в верхней части цикла перед выполнением любого кода. Таким образом, он не выполняется, если условие оценивается как ложное.
Переменные
PowerShell позволяет хранить все типы значений. Например, он может хранить результаты команд и элементы командных выражений, такие как имена, пути и параметры. Вот некоторые из различных переменных PowerShell.
Переменные, созданные пользователем: Они создаются и поддерживаются пользователем. Переменные, которые вы создаете в командной строке PowerShell, будут существовать только до тех пор, пока открыто окно PowerShell. Когда вы закрываете окно PowerShell, эти переменные удаляются. Если вы хотите сохранить переменную, вам необходимо добавить ее в свой профиль PowerShell. Вы можете создавать переменные и объявлять их с тремя различными диапазонами: глобальным, скриптовым или локальным.
Автоматические переменные: Эти переменные хранят состояние PowerShell и создаются PowerShell. Только PowerShell может изменять их значения по мере необходимости для поддержания точности. Пользователи не могут изменять значение этих переменных. Например, переменная $PSHOME будет хранить путь к директории установки PowerShell.
Переменные предпочтений: Эти переменные хранят предпочтения пользователя для PowerShell и создаются PowerShell. Эти переменные заполнены значениями по умолчанию и могут быть изменены пользователями. Например, переменная $MaximumHistoryCount задает максимальное количество записей в истории сеансов.
Чтобы создать новую переменную, необходимо использовать оператор присваивания и присвоить переменной значение. Объявлять переменную перед ее использованием не нужно. Значение по умолчанию для всех переменных — $null.
Функция
Именование функции
Для именования функции используйте имя регистра Паскаля с утвержденным глаголом и существительным в единственном числе. Список утвержденных глаголов можно получить, выполнив Get-Verb:
Get-Verb | Sort-Object -Property Verb
Создание простой функции
Для создания простой функции используйте ключевое слово function, за которым следует имя функции. Затем используйте открытую и закрывающую фигурные скобки. Функция будет выполнять код, содержащийся в этих фигурных скобках.
Работа с модулями
Модуль — это пакет, содержащий объекты PowerShell, такие как команды, провайдеры, функции, рабочие процессы, значения переменных и псевдонимы. Элементы пакета можно реализовать в сценарии PowerShell, скомпилированной библиотеке DLL или и в том, и в другом. PowerShell автоматически импортирует модули при первом запуске любой команды в установленном модуле. Вы можете использовать команды в модуле без настройки или конфигурации профиля.
Как использовать модуль
Чтобы использовать любой модуль, его необходимо сначала установить. Затем найдите команду, которая поставляется вместе с модулем, и используйте ее.
Установка модуля
Если вы получили модуль в виде папки, установите его перед использованием в командной строке PowerShell. Некоторые модули являются предустановленными. Вы можете использовать следующую команду для создания каталога Modules для текущего пользователя:
Скопируйте всю папку модуля в каталог Modules. Для копирования папки можно использовать любой метод, включая проводник Windows, Cmd.exe и PowerShell.
Поиск установленных модулей
Выполните следующие действия, чтобы найти модули, установленные в местоположении модулей по умолчанию (не импортированные).
Поиск команд в модуле
Выполните следующую команду, чтобы найти команды модуля:
Импортирование модуля
Выполните следующую команду с нужным именем модуля:
Удаление имени модуля
Вы можете выполнить следующую команду с нужным именем модуля:
Просмотр расположения модулей по умолчанию
Используйте следующую команду для просмотра расположения модулей по умолчанию:
Добавление местоположения модуля по умолчанию
Вы можете использовать следующий формат команды:
Добавление местоположения модуля по умолчанию в Linux или macOS
Используйте следующее, чтобы выполнить ту же команду, что и выше, только в Linux или macOS:
Хеш-таблицы
Хеш-таблица — это сложная структура данных для хранения данных в виде пар ключ-значение. Мы также называем хэш-таблицу словарем или ассоциативным массивом. Чтобы понять, что такое хэш-таблица, рассмотрим серию IP-адресов и соответствующие имена компьютеров. В хэш-таблице эти данные хранятся в виде пар ключ-значение, где IP-адреса обозначают ключи, а имена компьютеров — соответствующие им значения.
Синтаксис хэш-таблицы выглядит следующим образом:
Синтаксис упорядоченного словаря выглядит следующим образом:
Создание хэш-таблиц
Если вы хотите создать хэш-таблицу, выполните следующие действия:
- Начните хэш-таблицу со знака at (@) и заключите ее в фигурные скобки (<>).
- Хэш-таблица должна содержать хотя бы одну пару ключ-значение, поэтому вводите данные после создания хэш-таблицы.
- Отделите ключ от его значения с помощью знака равенства (=).
- Разделяйте пары ключ/значение в хэш-таблице точкой с запятой (;).
- Заключите пробел между ключами в кавычки. Значения должны быть допустимыми выражениями PowerShell. Также заключайте строки в кавычки, даже если между ними нет пробелов.
- Сохраните хэш-таблицу как переменную, чтобы эффективно управлять ею.
- При назначении упорядоченной хэш-таблицы переменной поместите атрибут [ordered] перед символом @. Если поместить его перед именем переменной, команда не выполнится.
Добавление и удаление ключей и значений
Чтобы добавить ключи и значения в хэш-таблицу, используйте следующий формат команды:
Например, вы можете добавить ключ «Time» со значением «Now» в хэш-таблицу с помощью следующего формата оператора:
Или вы можете удалить ключ с помощью этого выражения:
Асинхронная обработка событий
Эти команды позволяют регистрировать и отменять подписки на события и выводить список существующих подписок. Вы также можете перечислить ожидающие события и обработать или удалить их по желанию.
Команды PowerShell для обработки событий
| Имя командлета обработки событий | Описание |
| Register-ObjectEvent | Этот командлет регистрирует подписку на события для событий, генерируемых объектами .NET |
| Register-WmiEvent | Регистрирует подписку на события для событий, генерируемых объектами WMI |
| Register-EngineEvent | Регистрирует подписку на события для событий, генерируемых самим PowerShell |
| Get-EventSubscriber | Получает список зарегистрированных подписок на события в сессии |
| Unregister-Event | Удаляет одну или несколько зарегистрированных подписок на события |
| Wait-Event | Ожидает наступления события. Эта команда может ждать определенного события или любого события. Она также позволяет указать тайм-аут, ограничивающий время ожидания события. По умолчанию ожидание длится вечно. |
| Get-Event | Получает ожидающие необработанные события из очереди событий |
| Remove-Event | Удаляет ожидающее событие из очереди событий |
| New-Event | Эта команда вызывается в сценарии, чтобы позволить сценарию добавлять свои собственные события в очередь событий |
Шпаргалка по PowerShell: заключение
В итоге? Шпаргалка по PowerShell — это универсальный справочник по синтаксису и командам PowerShell. В этой шпаргалке по командам Windows PowerShell мы рассмотрели все основы, чтобы помочь даже новичкам сориентироваться в PowerShell.
Как и в любом другом языке программирования, вы можете использовать переменные и операторы, создавать псевдонимы и функции и даже поддерживать управление потоком.
Если вы готовитесь к предстоящему собеседованию, держите эту шпаргалку по PowerShell 5.0 под рукой для быстрого ознакомления с простыми примерами.
Хотите расширить свои знания о командной строке Windows?
Часто задаваемые вопросы
1. Как получить список команд PowerShell?
Вы можете использовать команду get-command.
2. Сколько существует команд PowerShell?
В PowerShell существует более 200 команд.
3. Как изучить PowerShell для начинающих?
Вы можете воспользоваться вводным руководством Microsoft по PowerShell. Оно содержит простой язык и простые примеры для лучшего понимания.
4. Является ли Windows PowerShell тем же самым, что и командная строка?
В следующей таблице приведены основные различия между PowerShell и командной строкой:
| PowerShell | Командная строка |
| Введен в 2006 году | Введен в 1981 году |
| Работает как с пакетными командами, так и с командами PowerShell | Работает только с пакетными командами |
| Позволяет создавать псевдонимы для команд или сценариев | Не поддерживает создание псевдонимов команд |
| Позволяет передавать вывод команды другим командам. | не позволяет передавать вывод команды другим командам. |
| Вывод осуществляется в виде объекта | Вывод — просто текст |
| Можно выполнять последовательность команд в рамках сценария | Требуется, чтобы одна команда завершилась раньше другой |
| Имеет библиотеки для программирования, так как построен на .net framework. | Отсутствие библиотек программирования |
| Бесшовная интеграция с WMI | Требуется внешний плагин для взаимодействия с WMI |
| Поддерживает системы Linux | Не поддерживает системы Linux |
| Выполняет все типы программ | Запускает только программы консольного типа |
5. Как сделать командную строку по умолчанию вместо PowerShell?
Откройте Настройки > Персонализация > Панель задач. Теперь установите опцию «Заменить Command Prompt на Windows PowerShell» в меню, когда я нажимаю правой кнопкой мыши на кнопку «Пуск» или нажимаю клавиши Windows + X» в положение «Выкл».
Руководство по Windows PowerShell для начинающих
В этой статье про PowerShell для начинающих мы посмотрим, как писать скрипты, которые помогают оптимизировать управление Windows-окружением.
PowerShell — это объектно-ориентированный программный движок и скриптовый язык с интерфейсом командной строки, предоставляющий широкие возможности для конфигурирования операционных систем семейства MS Windows. Он предлагает как чисто консольный интерфейс, так и полноценную среду разработки PowerShell ISE (Integrated Scripting Environment, встроенное скриптовое окружение) для скриптов.
Для запуска интерфейса командной строки введите powershell в меню «Выполнить» (WinKey + R). PowerShell ISE запускается с помощью команды «PowerShell ISE» в том же меню. ISE более предпочтительно, так как предоставляет более широкие возможности разработчику благодаря подсветке синтаксиса, функции автозаполнения кода и другим особенностям, присущим многим «большим» IDE.

Среда разработки Windows PowerShell ISE
Написание и запуск скриптов
Скрипты сохраняются в виде файлов с расширением .ps1 . Несмотря на то, что PowerShell уже давно является нативной частью ОС Windows, вы не сможете запустить его скрипты простым двойным щелчком. Для этого надо кликнуть правой кнопкой по скрипту и выбрать «Запустить в PowerShell».
Также существуют системные политики, ограничивающие выполнение скриптов. Можно проверить текущие параметры политики, введя команду Get-ExecutionPolicy . Результатом будет одно из следующих значений:
- Restricted — выполнение скриптов запрещено. Стандартная конфигурация;
- AllSigned — можно запускать скрипты, подписанные доверенным разработчиком; перед запуском скрипта PowerShell запросит у вас подтверждение;
- RemoteSigned — можно запускать собственные скрипты или те, что подписаны доверенным разработчиком;
- Unrestricted — можно запускать любые скрипты.
Для начала работы необходимо изменить настройку политики запуска на RemoteSigned, используя команду Set-ExecutionPolicy :
После выполнения команды можно будет запускать свои скрипты
Командлеты
Командлеты — это команды с предопределённой функцией, подобные условным операторам в языках программирования. У них есть несколько ключевых особенностей:
- существуют системные, пользовательские и опциональные командлеты;
- результатом выполнения командлета будет объект или массив объектов;
- командлеты могут обрабатывать данные и передавать их другим командлетам с помощью конвейеров;
- командлеты нечувствительны к регистру, так что нет никакой разницы между Get-ADUser , get-aduser и gEt-AdUsEr ;
- в качестве разделителя используется символ ; .
Каждый командлет содержит в себе глагол и существительное, разделяемые дефисом. Например:
- Get-Process — отобразить текущие процессы, запущенные на компьютере;
- Get-Service — отобразить список служб и их статус;
- Get-Content — отобразить содержимое указанного файла, например Get-Content C:\Windows\System32\drivers\etc\hosts .
При необходимости список всех доступных командлетов можно вывести с помощью Get-Help-Category. Запомните эту команду — она крайне важна для тех, кто изучает PowerShell с нуля, так как помогает быстрее начать ориентироваться в его возможностях.

Результат выполнения команды Get-Help-Category
Также можно создавать свои командлеты, но эта тема выходит за рамки нашего руководства по PowerShell для начинающих.
Параметры
У каждого командлета есть несколько параметров, определяющих его работу. PowerShell ISE автоматически предлагает все доступные параметры с отображением их типа. Например, Get-Service-NameW* выводит список служб, у которых имя начинается с W . Если вы забыли, какие параметры у введённого командлета, воспользуйтесь Get-Member .
Например, Get-Process | Get-Member :

Список параметров командлета Get-Process
Если вы не нашли того, что нужно, или не уверены в том, как правильно задаются параметры, можно даже запросить примеры с помощью параметра -Examples . Встроенное руководство по PowerShell покажет, для чего используются разные параметры:

Примеры использования командлета
Некоторые командлеты также могут вызываться с помощью алиасов. Например, вместо Get-Help можно просто написать Help — эта команда также вызовет встроенное руководство по PowerShell.
При написании больших скриптов или коллективной разработке можно пользоваться комментариями. Каждый комментарий начинается с символа # , а блок комментариев ограничивается комбинациями символов <# и #> в начале и в конце соответственно.
Конвейер
PowerShell позволяет осуществлять обмен данными между командлетами с помощью конвейера. Например:
- GetService | SortObject -property Status — сортировка запущенных служб по статусу;
- “Hello World!” | Out-File C:\ps\test.txt — запись текста в файл.
Можно использовать несколько конвейеров. Например, следующий скрипт выводит список имён всех служб за исключением остановленных:
Get-Service | WHERE <$_.status -eq “Running”>| SELECT displayname
Заключение
Это руководство для тех, кто изучает PowerShell с нуля, поэтому здесь раскрыты только базовые понятия и приёмы. После его прочтения у вас должно появиться представление о том, что собой представляет этот инструмент. Также мы рассмотрели варианты изменения политики выполнения скриптов, что такое командлет, как они обмениваются данными с помощью конвейера и как получить свойства нужного объекта. Помните, что в случае затруднений можно воспользоваться командлетом Get-Help — это одна из самых важных команд для начинающих изучать PowerShell.
Если пользуетесь не только Windows, но и Linux, посмотрите статью про команды терминала Linux для начинающих. В ней рассказывается про работу с процессами и файлами, навигацию, каналы, xargs, awk и grep.
Что такое Windows powershell и для чего он нужен
Первые операционные системы не содержали никакого интерфейса взаимодействия с пользователем, кроме командной строки. MS-DOS, например, позволяла общаться с собой только так. Графический интерфейс пользователя требовал от машины значительно большей мощности, чем имелось у компьютеров того времени. Появление GUI, казалось бы, устранило потребность в консоли. Однако командная строка – лишь кажущееся излишество.
Поясним это на примере. Любую отдельную команду к ОС можно обернуть интерфейсом из окошек и элементов управления, наподобие флажков, списков выбора и кнопок. Но что делать, если команд таких несколько? То есть тогда, когда нужно последовательно выполнять команду за командой. Очевидно, графический интерфейс для такой задачи окажется сильно перегруженным. И тем более сложным, чем больше команд потребуется выполнить.

Вторая причина неповоротливости GUI – модификация любого алгоритма потребует значительных модификаций оконного интерфейса, разработка и сопровождение которых отнюдь не дешевы. Именно поэтому интерфейс консоли не потерял своей актуальности. Одежка из окошек хороша для тех задач, алгоритмы которых не модифицируются слишком часто и не носят характер batch-потоков исполнения.
Для других же задач, вроде последовательной обработки большого числа файлов без вмешательства пользователя, гораздо лучше подойдут командные файлы. Ранние языки программирования, типа Cobol и Rexx, исповедовали именно эту идеологию. Впоследствии она была перенесена в концепцию командных файлов ОС.
Во всех ранних версиях Windows такие файлы имели расширение .bat и представляли собой обычные текстовые файлы с последовательным расположением командных инструкций. Сами команды могли иметь параметры, в том числе и вводимые пользователем в процессе исполнения. Синтаксис команд определялся каждой ОС по-своему. В Linux, например, имеется несколько очень мощных командных оболочек с существенно различающимся синтаксисом.
PowerShell на смену «батникам»
Со временем командные оболочки сильно эволюционировали. Процессору «батников» (.bat-файлов) DOS пришел на смену командный процессор 4DOS, в Windows происходили аналогичные изменения – перечень исполнимых инструкций значительно расширился, приобретая сходство с современными скриптовыми языками программирования.
Однако ориентация таких систем не изменилась – все они как были, так и оставались инструментами системного администратора или (в редких случаях) продвинутого пользователя.
Также у них появились конкуренты, наподобие скриптов JScript и VBScript, функционирующих на базе языковой машины WHS(Windows Script Host). Казалось бы, эволюция «батников» зашла в тупик, и они должны были вымереть, как динозавры. Но не тут то было.

Осенью 2003-го года разработчиками Microsoft был анонсирован новый командный процессор под именем Windows PowerShell с радикально переработанной концепцией и синтаксисом. Причем движком для него выступала платформа .Net Framework, а это означало, ни много ни мало, доступ из скрипта к огромной копилке возможностей этого фреймворка. В PowerShell команды перестали быть простыми текстовыми инструкциями, а превратились в классы.
Net со всеми вытекающими из этого последствиями (что такое классы в современном программировании, думается, объяснять не нужно) и получили новое имя – «командлеты». Можно еще много рассуждать на тему отличий оболочки PowerShell от прочих скриптовых оболочек, но лучше предложить краткий перечень ее функций, чтобы вы поняли, что такое PS.