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

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

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

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

Что такое PowerShell?

PowerShell — это кроссплатформенная оболочка командной строки и язык сценариев, созданный компанией Microsoft для автоматизации администрирования операционных систем. Инструмент сочетает в себе возможности традиционной командной оболочки (как CMD или Bash) и полноценного объектно-ориентированного языка программирования.

Инструмент базируется на платформе .NET Framework или .NET Core (в версии PowerShell 7+). Это фундаментальное отличие от классических командных интерпретаторов, которые работают преимущественно с текстовыми потоками. PowerShell позволяет управлять системами Windows, серверами, сетевыми устройствами и облачными сервисами через единый интерфейс, используя объекты данных вместо строк.

Архитектура PowerShell включает в себя движок выполнения скриптов, набор встроенных командлетов, поддержку модулей и интеграцию с экосистемой .NET. Движок обрабатывает команды, управляет памятью, выполняет сборку мусора и обеспечивает безопасность выполнения кода.


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

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

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

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

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

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

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

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

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

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

# Заголовок сценария
# Автор: Системный администратор
# Дата создания: 2026-03-11
# Описание: Пример базового скрипта

# Определение переменной
$имяПеременной = "Значение"

# Вызов командлета
Write-Host "Привет, мир!"

# Условная конструкция
if ($имяПеременной -eq "Значение") {
Write-Host "Условие выполнено"
}

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

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

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

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

<#
.SYNOPSIS
Создает резервную копию папки.

.DESCRIPTION
Данный скрипт копирует содержимое указанной папки
в архив с расширением .zip.

.PARAMETER SourcePath
Полный путь к исходной папке.

.PARAMETER DestinationPath
Полный путь к месту сохранения архива.

.EXAMPLE
.\Backup.ps1 -SourcePath "C:\Данные" -DestinationPath "C:\Backup"
#>

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

Файлы сценариев должны быть сохранены в кодировке 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

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

Запуск сценария осуществляется путем указания пути к файлу с расширением .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

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


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

Принцип работы конвейера

Конвейер (pipeline) — механизм передачи выходных данных одной команды на вход следующей. В PowerShell конвейер передает объекты, а не текстовые строки. Это обеспечивает сохранение структуры данных и свойств между этапами обработки.

Символ конвейера обозначается вертикальной чертой |. Первый элемент слева получает входные данные, второй элемент обрабатывает результат первого, и так далее.

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

Get-Process | Where-Object {$_.CPU -gt 100} | Select-Object -First 5

В этом примере:

  1. Get-Process получает список всех процессов.
  2. Where-Object фильтрует процессы, где потребление CPU превышает 100 единиц.
  3. Select-Object выбирает первые пять результатов.

Преимущества объектного конвейера

Работа с объектами через конвейер дает ряд преимуществ:

  • Сохранение типов данных на всех этапах.
  • Возможность доступа к свойствам и методам объектов без дополнительного парсинга.
  • Уменьшение количества ошибок при обработке сложных структур.
  • Повышение производительности за счет отсутствия конвертации в текст.

Фильтрация и выборка данных

Командлет Where-Object используется для фильтрации объектов по заданным условиям. Он принимает выражение, которое возвращает True или False для каждого объекта.

Пример фильтрации:

Get-Process | Where-Object {$_.WorkingSet -gt 1GB}

Командлет Select-Object выбирает конкретные свойства объектов или ограничивает количество выводимых элементов.

Пример выбора свойств:

Get-Process | Select-Object Name, Id, CPU

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

Get-Process | Select-Object -First 10

Группировка и сортировка

Командлет Group-Object группирует объекты по указанному свойству. Он полезен для подсчета количества элементов в каждой группе.

Пример группировки:

Get-Process | Group-Object -Property Company

Командлет Sort-Object сортирует объекты по значению свойства в порядке возрастания или убывания.

Пример сортировки:

Get-Process | Sort-Object -Property CPU -Descending

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

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

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

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

Get-Help

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

Get-Help Get-Process

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

Get-Help Get-Process -Примеры

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

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

Переменная $процесс содержит объект типа Система.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

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


См. также

Другие статьи этого же раздела в боковом меню (как на странице «О разделе»).

Освоение главы0%