Перейти к основному содержимому

Основы языка PowerShell

Разработчику Архитектору

Play ITЗагрузка интерактивного демо…


Основы языка PowerShell

Что такое PowerShell?

PowerShell — это язык программирования со следующими особенностями:

  • Типизация — динамическая, слабая; опциональные аннотации типов (PowerShell 5+); статическую проверку дают PSScriptAnalyzer и анализаторы в IDE.
  • Парадигма — мультипарадигменный: императивный, объектно-ориентированный (через .NET), функциональный (объектный конвейер), скриптовый.
  • Уровень — высокоуровневый скриптовый (работа через командлеты и объектный конвейер вместо текстовых потоков).
  • Выполнение — интерпретируемый: сценарий .ps1 парсится и выполняется движком PowerShell на платформе .NET без отдельной предварительной компиляции.
  • Память — автоматическая (сборщик мусора CLR).
  • Платформа — Windows PowerShell 5.1 нативный для Windows (.NET Framework); PowerShell 7+ кроссплатформенный (.NET); управляемый runtime; не транспилируется в другой язык.
  • Формат разработки — скриптовый: однострочники, файлы .ps1, модули .psm1; структура проекта не обязательна.
  • Направление — автоматизация администрирования, DevOps, конфигурация Windows/Linux, облачная инфраструктура (Azure, AWS, GCP).
  • REPL — интерактивная оболочка: pwsh (PowerShell 7+) или powershell (Windows) в терминале; устаревший PowerShell ISE; интегрированный терминал VS Code.
  • Поколение — классический (Windows PowerShell с 2006 года), современный (PowerShell 7+ на .NET Core / Modern .NET, кроссплатформенный).
  • Параллелизм и асинхронностьStart-Job, runspaces, ForEach-Object -Parallel (PS 7+); нативных async/await в синтаксисе PowerShell нет, но доступны .NET Task и TPL.
  • Безопасность — относительно "опасный" — слабая динамическая типизация, выполнение с правами пользователя, широкий доступ к .NET и ОС; смягчают политики выполнения (ExecutionPolicy), подпись скриптов и Constrained Language Mode.

Если какой-то пункт из списка непонятен — подробные определения и примеры в Язык программирования.


Отличия от CMD и Bash

Традиционные оболочки командной строки, такие как Command Prompt (CMD) в Windows или Bash в Linux, работают с текстовыми данными. Команда выводит текст, следующая команда принимает этот текст как входные данные и обрабатывает его как строку.

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

ХарактеристикаCMD / BashPowerShell
Тип данныхТекстовые строкиОбъекты .NET
Обработка выводаПарсинг текстаРабота с объектами
Язык сценариевОграниченный синтаксисПолноценный язык программирования
ПлатформаСпецифична для ОСКроссплатформенная (v6+)
Управление состояниемЧерез файлы и переменные средыЧерез объекты и состояния

Создание и формат файлов сценариев

Структура файла .ps1

Файл сценария PowerShell имеет расширение .ps1. Этот формат представляет собой обычный текстовый файл, содержащий код на языке PowerShell. Расширение указывает операционной системе, что содержимое файла должно быть обработано интерпретатором PowerShell.

Структура файла включает следующие элементы:

  • Комментарии — строки, начинающиеся с символа #, игнорируются исполнителем.
  • Переменные: объявления и присваивания значений.
  • Командлеты: вызовы функций и методов.
  • Логические конструкции — циклы, условия, блоки кода.
  • Импорт модулей: подключение дополнительных функциональных возможностей.

Пример базовой структуры файла:

Код ITЗагрузка примера кода…


Комментарии и документация

Комментарии в PowerShell играют важную роль в поддержке читаемости кода. Они могут быть однострочными, начинающимися с #, или многострочными, заключенными в блоки <# и #>.

Многострочные комментарии часто используются для создания документации внутри самого файла. Это позволяет хранить описание сценария, список параметров, примеры использования и историю изменений непосредственно в коде.

Пример многострочного комментария:

Код ITЗагрузка примера кода…


Кодировка файла

Файлы сценариев должны быть сохранены в кодировке UTF-8 без BOM или ANSI для корректной работы кириллических символов. Современные редакторы кода, такие как Visual Studio Code, позволяют выбрать нужную кодировку при сохранении файла. Использование неправильной кодировки может привести к ошибкам при выполнении скрипта, особенно если в тексте содержатся русские буквы.


Написание и выполнение скриптов

Процесс написания сценария

Написание сценария начинается с определения задачи. Разработчик формулирует цель, затем разбивает её на последовательность шагов. Каждый шаг реализуется с помощью соответствующего командлета или конструкции языка.

Рекомендуемый подход включает следующие этапы:

  1. Анализ требований и определение входных данных.
  2. Выбор необходимых командлетов из справочника.
  3. Написание кода построчно с проверкой каждого блока.
  4. Тестирование сценария в безопасном режиме.
  5. Оптимизация и добавление обработки ошибок.

При написании кода следует соблюдать правила именования переменных и функций. Имена должны быть понятными и описывать суть действия. Рекомендуется использовать стиль CamelCase для имен переменных и PascalCase для имен функций и командлетов.


Режимы выполнения скриптов

PowerShell поддерживает несколько режимов выполнения сценариев, которые определяют уровень безопасности и допустимость запуска кода.

Реализация выполнения:

  • Unrestricted: Позволяет запускать любые локальные и удаленные сценарии. Используется только в изолированных средах.
  • RemoteSigned: Требует подписи для всех сценариев, полученных из интернета. Локальные сценарии выполняются без ограничений.
  • Restricted: Стандартный режим для пользовательских учетных записей. Запрещает выполнение любых сценариев, кроме встроенных командлетов.
  • AllSigned: Требует цифровой подписи для всех сценариев, включая локальные.

Проверка текущего режима выполняется командлетом Get-ExecutionPolicy.

Get-ExecutionPolicy

Изменение политики выполняется командлетом Set-ExecutionPolicy. Для изменения глобальных настроек требуется права администратора.

Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Bypass и загрузка кода из сети

Режим Bypass и IEX (DownloadString …) из туториалов отключают защиту.

Разбор рисков — Опасные скрипты.


Запуск сценариев

Запуск сценария осуществляется путем указания пути к файлу с расширением .ps1. Если текущая директория не находится в списке путей поиска PATH, необходимо указать полный путь или относительный путь.

Пример запуска:

.\MyScript.ps1

Для выполнения сценария из другой директории используется оператор . перед путем:

.\C:\Scripts\MyScript.ps1

Если файл находится в текущей директории, но имя начинается с точки, необходимо использовать точку перед именем файла. Без точки система попытается найти команду с таким именем, а не файл.


Аргументы и параметры

Сценарии могут принимать аргументы при запуске. Параметры передаются после имени файла через пробел. Внутри сценария они доступны через специальные переменные $args или через блок param().

Пример использования параметров:

param(
[string]$ИмяПользователя,
[int]$Количество
)

Write-Host "Привет, $ИмяПользователя! Количество: $Количество"

Вызов сценария с параметрами:

.\Greet.ps1 -ИмяПользователя "Алексей" -Количество 5

Командлеты и их назначение

Что такое командлет

Командлет — это функция или команда, реализованная в виде класса C# и предоставляемая модулями PowerShell. Командлеты являются основными строительными блоками PowerShell. Они выполняют конкретные действия — чтение файлов, управление процессами, работу с реестром, взаимодействие с сетью.

Каждый командлет имеет уникальное имя, состоящее из глагола и существительного, разделенных дефисом. Глагол описывает действие, существительное — объект операции.

Примеры командлетов:

  • Get-Process: получение информации о процессах.
  • запуск службы.
Start-Service
  • New-Item: создание нового элемента.
  • Remove-Item: удаление элемента.
  • Set-Location: изменение рабочей директории.

Синтаксис командлетов

Синтаксис командлета включает имя командлета, параметры и значения параметров. Параметры могут быть обязательными или необязательными. Обязательные параметры указываются всегда, необязательные можно опустить, если они имеют значения по умолчанию.

Пример вызова командлета:

Get-Process -Name notepad

В этом примере -Name является параметром, а notepad — его значением. Параметр может быть указан полностью или сокращенно, если сокращение однозначно.


Получение списка командлетов

Для просмотра всех доступных командлетов используется командлет Get-Command. Он выводит список всех команд, доступных в текущей сессии, включая встроенные и импортированные из модулей.

Get-Command

Фильтрация командлетов по типу действия:

Get-Command -Verb Get
Get-Command -Verb Start
Get-Command -Verb Set

Фильтрация по объекту:

Get-Command -Noun Process
Get-Command -Noun Service
Get-Command -Noun File

Модули и расширение функциональности

Модуль PowerShell — это пакет кода, содержащий набор командлетов, функций, переменных и других элементов. Модули расширяют возможности стандартной установки PowerShell.

Список доступных модулей отображается командлетом Get-Module -ListAvailable.

Get-Module -ListAvailable

Импорт модуля выполняется командлетом Import-Module.

Import-Module ActiveDirectory

После импорта становятся доступны все командлеты, определенные в модуле. Некоторые модули загружаются автоматически при запуске сессии.


Провайдеры и пути

Провайдер (provider) — адаптер, через который одни и те же командлеты обращаются к разным хранилищам. Путь всегда включает имя провайдера; в списке "дисков" (Get-PSDrive) видно, что доступно в сессии.

Путь (примеры)ПровайдерСодержимое
C:\, D:\FileSystemФайлы и папки
HKLM:\, HKCU:\RegistryРазделы реестра Windows
Cert:\CertificateХранилища сертификатов
Env:EnvironmentПеременные среды процесса
Function:\, Alias:\встроенныеФункции и псевдонимы сессии
Get-PSDrive | Format-Table Name, Provider, Root -AutoSize

# Файлы — привычный диск
Get-ChildItem C:\Windows\Logs -Filter *.log | Select-Object -First 3 Name

# Реестр — тот же Get-ChildItem, другой путь
Get-ChildItem HKLM:\SOFTWARE\Microsoft\PowerShell | Select-Object Name

# Сертификаты для подписи кода
Get-ChildItem Cert:\CurrentUser\My -CodeSigningCert | Select-Object Subject, Thumbprint

Set-Location Cert:\CurrentUser\My временно делает хранилище сертификатов "текущей папкой"; $PWD покажет этот путь. Сетевую папку можно смонтировать как диск: New-PSDrive -Name Share -PSProvider FileSystem -Root \\server\backup -Persist.

Set-Location Cert:\CurrentUser\My

Командлеты *-Item, Get-Location, Test-Path работают с любым зарегистрированным провайдером — не нужно запоминать отдельные утилиты для реестра и каталога, как в эпоху cmd.


Потоки вывода

Каждая команда пишет не в "одну строку консоли", а в отдельные потоки (streams). Конвейер | по умолчанию связывает только поток успеха (Success). Ошибки, предупреждения и отладочные сообщения идут другими каналами — их можно включить или перенаправить в файл.

ПотокНомерСодержимоеКак увидеть или записать
Success1Объекты-результат командлетавывод по умолчанию; > — в файл
Error2Объекты ErrorRecordвиден при ошибке; 2> — в файл; 2>&1 — вместе с успехом
Warning3Предупреждения-WarningAction Continue; Write-Warning
Verbose4Подробный ход работы-Verbose; $VerbosePreference = 'Continue'
Debug5Отладочные сообщения-Debug; $DebugPreference = 'Continue'; Write-Debug
Information6Информационные (PS 5.4+)Write-Information; 6> — в файл
# Только предупреждения и ошибки в журнал
Get-ChildItem C:\Missing -ErrorAction SilentlyContinue -WarningAction Continue 3>warn.log 2>err.log

# Подробный вывод одной команды
Get-Process -Name pwsh -Verbose

Поведение при сбоях (-ErrorAction, $Error, try/catch) разобрано в обработке ошибок.


Конвейер и передача данных

Конвейер (|) передаёт объекты между командлетами, сохраняя свойства и типы — без разбора текста, как в cmd. Углублённо — $_, ForEach-Object, Add-Member в цепочке — в объектной модели и конвейере.

Get-Process |
Where-Object CPU -gt 10 |
Sort-Object CPU -Descending |
Select-Object -First 5 Name, CPU, Id

Частые звенья цепочки — Where-Object, Select-Object, Sort-Object, Group-Object, ForEach-Object, Measure-Object; для отображения в конце — Format-Table или Format-List (после них объекты в конвейер дальше обычно не передают).


Справка и документация

Получение справки по командлетам

PowerShell предоставляет встроенную систему помощи, доступную через командлет Get-Help. Эта система содержит описания командлетов, примеры использования, параметры и ссылки на дополнительную информацию.

Просмотр общей справки:

Get-Help

Просмотр справки по конкретному командлету:

Get-Help Get-Process

Подробная справка с примерами:

Get-Help Get-Process -Examples

Справка с полным описанием параметров:

Get-Help Get-Process -Full

Обновление базы знаний

База справки может обновляться из интернета для получения актуальной информации. Командлет Update-Help скачивает последние версии документов.

Update-Help

Обновление требует прав администратора и подключения к интернету.


Поиск командлетов по ключевым словам

Командлет Get-Help поддерживает поиск по ключевым словам. Это позволяет находить команды, связанные с конкретной задачей.

Пример поиска:

Get-Help *File*
Get-Help *Сеть*
Get-Help *Process*

Объекты .NET и их свойства

Природа объектов в PowerShell

Все данные в PowerShell представлены как объекты платформы .NET. Каждое значение, полученное из командлета, является экземпляром класса. Объекты обладают свойствами (данные) и методами (действия).

Пример получения объекта процесса:

$процесс = Get-Process -Name notepad

Переменная $процесс содержит объект типа System.Diagnostics.Process.


Доступ к свойствам

Свойства объекта обращаются через точку после имени переменной. Свойство содержит данные, характеризующие объект.

Пример доступа к свойству:

$процесс.Name
$процесс.Id
$процесс.CPU

Вывод всех свойств объекта:

$процесс | Format-List *

Методы объектов

Методы — это функции, определенные внутри класса объекта. Они вызываются с использованием скобок после имени метода.

Пример вызова метода:

$процесс.Kill()

Этот метод завершает работу процесса.

Другие примеры методов:

  • WaitForExit() — ожидание завершения процесса.
  • Refresh() — обновление информации об объекте.
  • Close() — закрытие соединения с ресурсом.

Преобразование объектов в текст

Иногда требуется вывести объект в виде текста. PowerShell автоматически вызывает метод ToString() для преобразования объекта в строку.

Пример явного преобразования:

[string]$строка = $процесс.ToString()

Форматирование вывода можно контролировать с помощью командлетов Format-Table, Format-List, Format-Custom.


Переменные и управление ими

Объявление переменных

Переменные в PowerShell хранятся в памяти и обозначаются знаком доллара $. Имя переменной может содержать буквы, цифры и знак подчеркивания, но не должно начинаться с цифры.

Пример объявления:

$число = 42
$текст = "Привет"
$массив = @("a", "b", "c")

Типы данных

PowerShell использует динамическую типизацию. Тип переменной определяется автоматически в зависимости от присвоенного значения. Однако можно явно указать тип данных.

Пример явного указания типа:

[int]$возраст = 25
[string]$город = "Москва"
[bool]$активен = $true

Область видимости

Переменные имеют область видимости, определяющую, где они доступны. Существуют следующие области:

  • Local: доступна только внутри текущего блока кода.
  • Script: доступна во всем скрипте.
  • Global: доступна во всей сессии.
  • Private: видна только в текущем модуле.

Пример объявления глобальной переменной:

$global:переменная = "Глобальное значение"

Изменение и удаление переменных

Значение переменной можно изменить простым присваиванием.

$переменная = "Новое значение"

Удаление переменной выполняется командлетом Remove-Variable.

Remove-Variable -Name переменная

Специальные переменные

PowerShell содержит набор встроенных переменных, предоставляющих информацию о текущей среде.

ПеременнаяОписание
$PSVersionTableТаблица версий PowerShell
$PIDИдентификатор текущего процесса
$HostОбъект хоста консоли
$ArgsМассив аргументов сценария
$PWDТекущая рабочая директория
$HOMEДомашняя директория пользователя
$ErrorСписок последних ошибок

Пример использования:

Write-Host "Текущая директория: $PWD"
Write-Host "Идентификатор процесса: $PID"

Алиасы и их использование

Что такое алиас

Алиас — это краткое имя, которое заменяет полное имя командлета. Алисы упрощают ввод команд и делают сценарии короче. Они широко используются в повседневной работе.

Пример алиаса:

  • dir — алиас для Get-ChildItem.
  • ls — алиас для Get-ChildItem.
  • cd — алиас для Set-Location.
  • cls — алиас для Clear-Host.

Просмотр списка алиасов

Список всех активных алиасов выводится командлетом Get-Alias.

Get-Alias

Поиск конкретного алиаса:

Get-Alias dir

Создание новых алиасов

Пользователь может создавать собственные алиасы для удобной работы. Командлет New-Alias создает новое соответствие.

Пример создания:

New-Alias -Name mycp -Value Copy-Item

Теперь команда mycp будет выполнять функцию копирования файлов.


Удаление алиасов

Удаление алиаса выполняется командлетом Remove-Alias.

Remove-Alias -Name mycp

Импорт алиасов из других сред

PowerShell может импортировать алиасы из командной строки CMD или других оболочек. Это позволяет использовать привычные короткие имена.

Пример импорта:

Import-Module PSReadLine

Некоторые модули автоматически создают множество алиасов для совместимости.


С чего начать изучение PowerShell

  1. Get-Help, Get-Command, Get-Member.
  2. Конвейер: Get-* | Where-Object | Select-Object.
  3. Скрипт .ps1 с параметрами.

Дальше: синтаксисусловия и циклыпервая программа.


Содержание