Справочник по PowerShell
Справочник по PowerShell
PowerShell — это объектно-ориентированная командная строка и язык сценариев, созданный для системного администрирования и автоматизации задач в средах Windows и кроссплатформенных окружениях. Инструмент базируется на .NET Framework (или .NET Core/.NET 5+), что обеспечивает доступ к полной функциональности платформы .NET через консольный интерфейс.
Справочник структурирован по ключевым компонентам: от базовых типов данных до продвинутых механизмов обработки ошибок и модулей. Каждый раздел содержит определения, таблицы значений и примеры кода.
Типы данных и переменные
Базовые типы данных
PowerShell использует систему типизации .NET. Переменные автоматически определяют свой тип при присваивании значения или требуют явного указания типа.
| Тип данных | Описание | Пример значения |
|---|---|---|
| string | Последовательность символов | "Hello World", "C:\Path\To\File" |
| int | Целое число со знаком (32 бита) | 42, -100 |
| long | Целое число со знаком (64 бита) | 9223372036854775807 |
| double | Число с плавающей точкой (двойная точность) | 3.14159 |
| decimal | Точное десятичное число (для финансов) | 19.99m |
| bool | Логическое значение | $true, $false |
| char | Один символ | 'A', 'z' |
| datetime | Дата и время | Get-Date |
| array | Упорядоченная коллекция объектов | @(1, 2, 3) |
| hashtable | Коллекция пар ключ-значение | @{Name="Timur"; Age=30} |
| object | Базовый класс для всех типов | Любое значение без явного типа |
Специальные переменные
В PowerShell существуют встроенные переменные, управляющие средой выполнения и контекстом.
| Имя переменной | Значение / Описание |
|---|---|
$PSVersionTable | Содержит информацию о версии PowerShell (Major, Minor, Build, Revision) |
$PID | Идентификатор процесса текущего экземпляра PowerShell |
$Host | Объект, представляющий хост-приложение (например, ISE, ConHost) |
$args | Массив аргументов, переданных в скрипт или функцию |
$env: | Пространство имен для переменных среды системы |
$profile | Путь к файлу профиля текущего пользователя/сессии |
$LASTEXITCODE | Код возврата последней выполненной внешней команды |
$? | Булево значение, указывающее на успех последней операции |
$input | Поток входных данных, поступающих в текущий блок кода |
$stdout, $stderr, $stdin | Объекты потоков вывода, ошибки и ввода соответственно |
Синтаксис объявления переменных
Переменные объявляются с использованием символа $.
# Объявление и присваивание
$myVariable = "Значение"
$count = 10
# Явное указание типа
[string]$name = "Пример"
[int]$number = 5
# Использование массива
$array = 1, 2, 3, 4, 5
$multiArray = @("A", "B", "C")
# Использование хэш-таблицы
$config = @{
Server = "localhost"
Port = 8080
Enabled = $true
}
Операторы и выражения
Арифметические операторы
Операторы выполняют математические действия над числами.
| Оператор | Действие | Пример | Результат |
|---|---|---|---|
+ | Сложение | 5 + 3 | 8 |
- | Вычитание | 10 - 4 | 6 |
* | Умножение | 6 * 7 | 42 |
/ | Деление | 20 / 4 | 5 |
% | Остаток от деления | 17 % 5 | 2 |
** | Возведение в степень | 2 ** 3 | 8 |
- (унарный) | Изменение знака | -5 | -5 |
Операторы сравнения
Операторы возвращают логическое значение $true или $false.
| Оператор | Значение | Пример |
|---|---|---|
-eq | Равно | 5 -eq 5 |
-ne | Не равно | 5 -ne 3 |
-gt | Больше чем | 10 -gt 5 |
-ge | Больше или равно | 5 -ge 5 |
-lt | Меньше чем | 2 -lt 5 |
-le | Меньше или равно | 5 -le 6 |
-like | Соответствует шаблону (регистронезависимо) | "abc" -like "*b*" |
-notlike | Не соответствует шаблону | "abc" -notlike "*d*" |
-match | Регулярное выражение | "test" -match "^t.*t$" |
-notmatch | Не соответствует регулярному выражению | "test" -notmatch "x" |
-contains | Содержит элемент в коллекции | @(1,2,3) -contains 2 |
-notcontains | Не содержит элемент | @(1,2,3) -notcontains 5 |
-is | Проверка типа объекта | 5 -is [int] |
-isnot | Не является объектом указанного типа | "text" -isnot [int] |
-in | Элемент входит в набор | 3 -in @(1,2,3) |
-notin | Элемент не входит в набор | 5 -notin @(1,2,3) |
Логические операторы
Комбинируют условия и булевы значения.
| Оператор | Значение | Пример |
|---|---|---|
-and | Логическое И | $true -and $false |
-or | Логическое ИЛИ | $true -or $false |
-xor | Исключающее ИЛИ | $true -xor $true |
-not | Логическое НЕ | -not $false |
! | Краткая форма NOT | !(5 -gt 10) |
Операторы строк
Обработка текстовых данных.
| Оператор | Действие | Пример |
|---|---|---|
+ | Конкатенация | "Hello" + " " + "World" |
-replace | Замена по регулярному выражению | "abc" -replace "b", "X" |
-split | Разделение строки на массив | "a,b,c" -split "," |
-join | Объединение массива в строку | @("a","b") -join "-" |
.Length | Свойство длины строки | "Test".Length |
.ToUpper() | Преобразование в верхний регистр | "test".ToUpper() |
.ToLower() | Преобразование в нижний регистр | "TEST".ToLower() |
.Trim() | Удаление пробелов по краям | " test ".Trim() |
Операторы работы с коллекциями
| Оператор | Действие | Пример |
|---|---|---|
+= | Добавление элемента к коллекции | $arr += 10 |
-append | Добавление элемента в конец массива | $arr -append 10 |
-prepend | Добавление элемента в начало массива | $arr -prepend 10 |
.. | Генерация диапазона чисел | 1..5 (возвращает 1, 2, 3, 4, 5) |
| ` | ` | Передача объекта следующему коммандлету |
Коммандлеты и их параметры
Общие принципы работы
Каждый коммандлет PowerShell имеет набор параметров, определяющих его поведение. Параметры делятся на обязательные и необязательные.
Основные категории параметров
| Категория | Описание | Примеры |
|---|---|---|
-ParameterName | Параметр с именем, требующий значения | -Path C:\Temp |
-Value | Параметр для передачи значения напрямую | -InputObject $obj |
-Force | Принудительное выполнение операции | Remove-Item -Recurse -Force |
-WhatIf | Показывает, что произойдет, но не выполняет | Remove-Item -WhatIf |
-Confirm | Запрашивает подтверждение перед выполнением | Stop-Service -Confirm |
-Verbose | Вывод подробной информации о ходе выполнения | Install-Package -Verbose |
-Debug | Вывод отладочной информации | Get-ChildItem -Debug |
-ErrorAction | Управление поведением при ошибке | Get-Content -ErrorAction SilentlyContinue |
-ErrorVariable | Сохранение информации об ошибке в переменную | Get-Item -ErrorVariable err |
-WarningVariable | Сохранение предупреждений в переменную | Start-Sleep -WarningVariable warn |
-InformationVariable | Сохранение информационных сообщений | Write-Information -InformationVariable info |
-PipelineVariable | Переменная для конвейера | `Get-Process |
Таблица популярных коммандлетов и их ключевых параметров
Файловая система (Get-ChildItem, Copy-Item, Remove-Item)
| Коммандлет | Параметр | Описание |
|---|---|---|
Get-ChildItem | -Path | Путь к папке или файлу |
-Filter | Фильтр имени файла (используется провайдером) | |
-Include | Фильтр имени файла (применяется после получения) | |
-Recurse | Рекурсивный поиск в подпапках | |
-Depth | Глубина рекурсии | |
-File | Показывать только файлы | |
-Directory | Показывать только папки | |
-Name | Выводить только имена объектов | |
-Force | Показывать скрытые и системные объекты | |
Copy-Item | -Destination | Цель копирования |
-Recurse | Копировать подпапки и файлы | |
-Force | Переписывать существующие файлы | |
-PassThru | Возвращать копируемый объект в выходной поток | |
Remove-Item | -Path | Путь к удаляемому объекту |
-Recurse | Удалять подпапки и файлы | |
-Force | Удалять скрытые и системные объекты | |
-WhatIf | Показать эффект без удаления | |
-Confirm | Запрос подтверждения |
Процессор и служба (Get-Process, Start-Service, Stop-Process)
| Коммандлет | Параметр | Описание |
|---|---|---|
Get-Process | -Name | Фильтрация по имени процесса |
-Id | Фильтрация по идентификатору процесса (PID) | |
-ComputerName | Удаленный компьютер | |
-IncludeUserName | Добавить имя пользователя | |
-ErrorAction | Поведение при ошибке доступа | |
Start-Service | -Name | Имя службы |
-ComputerName | Удаленный компьютер | |
-Wait | Ждать завершения запуска | |
-Credential | Учетные данные для запуска | |
Stop-Process | -Id | Идентификатор процесса |
-Name | Имя процесса | |
-Force | Принудительно завершить процесс | |
-PassThru | Вернуть остановленный процесс |
Работа с сетью (Test-Connection, Invoke-RestMethod)
| Коммандлет | Параметр | Описание |
|---|---|---|
Test-Connection | -ComputerName | Хост для проверки |
-Count | Количество запросов | |
-Quiet | Вернуть только True/False | |
-BufferSize | Размер пакета ICMP | |
Invoke-RestMethod | -Uri | URL запроса |
-Method | HTTP метод (GET, POST, PUT, DELETE) | |
-Body | Тело запроса | |
-Headers | Заголовки HTTP | |
-ContentType | Тип контента (application/json) | |
-UseBasicParsing | Отключить HTML-парсер |
Модули и пакеты (Import-Module, Install-Module)
| Коммандлет | Параметр | Описание |
|---|---|---|
Import-Module | -Name | Имя модуля |
-Path | Путь к модулю | |
-Global | Импорт в глобальную область видимости | |
-DisableNameChecking | Игнорировать проверку имени модуля | |
-ArgumentList | Аргументы для импорта | |
Install-Module | -Name | Имя модуля |
-Scope | Область установки (CurrentUser, AllUsers) | |
-Force | Переустановка без вопросов | |
-AllowClobber | Переопределение существующих команд | |
-Repository | Источник модулей (PSGallery) |
Структуры управления потоком
Условные конструкции
Конструкция if
Выполняет блок кода, если условие истинно.
if ($value -gt 10) {
Write-Host "Значение больше 10"
} elseif ($value -eq 10) {
Write-Host "Значение равно 10"
} else {
Write-Host "Значение меньше 10"
}
Конструкция switch
Множественное ветвление по значению переменной.
switch ($status) {
"Active" {
Write-Host "Статус активен"
}
"Inactive" {
Write-Host "Статус неактивен"
}
Default {
Write-Host "Неизвестный статус"
}
}
Циклы
Цикл for
Итерация с фиксированным счетчиком.
for ($i = 0; $i -lt 5; $i++) {
Write-Host "Номер: $i"
}
Цикл foreach
Итерация по элементам коллекции.
$items = @("Apple", "Banana", "Cherry")
foreach ($item in $items) {
Write-Host "Фрукт: $item"
}
Цикл while
Цикл, выполняющийся, пока условие истинно.
$count = 0
while ($count -lt 5) {
Write-Host "Счетчик: $count"
$count++
}
Цикл do-while
Цикл, выполняющийся как минимум один раз.
do {
$input = Read-Host "Введите 'stop' для выхода"
Write-Host "Вы ввели: $input"
} while ($input -ne "stop")
Прерывание и продолжение циклов
| Оператор | Описание |
|---|---|
break | Немедленное завершение цикла |
continue | Переход к следующей итерации цикла |
return | Выход из функции или скрипта |
foreach ($num in 1..10) {
if ($num -eq 5) { continue } # Пропускает 5
if ($num -eq 8) { break } # Останавливается на 8
Write-Host $num
}
Функции и скрипты
Определение функций
Функция — это именованный блок кода, который можно вызывать多次.
function Get-Greeting {
param(
[string]$Name,
[string]$Language = "en"
)
switch ($Language) {
"ru" { return "Привет, $Name!" }
"de" { return "Hallo, $Name!" }
default { return "Hello, $Name!" }
}
}
$result = Get-Greeting -Name "Timur" -Language "ru"
Write-Host $result
Параметры функций
Параметры могут иметь ограничения и значения по умолчанию.
| Тип параметра | Описание |
|---|---|
[Parameter(Mandatory=$true)] | Обязательный параметр |
[Parameter(ValueFromPipeline=$true)] | Принимает данные из конвейера |
[Parameter(ValueFromPipelineByPropertyName=$true)] | Принимает данные из конвейера по свойствам |
[Parameter(Position=0)] | Позиционный параметр |
[ValidateSet("A", "B", "C")] | Ограничение допустимых значений |
[ValidateRange(1, 100)] | Диапазон допустимых чисел |
[Alias("n", "name")] | Псевдонимы для параметра |
Скрипты (.ps1)
Скрипт — это файл с расширением .ps1, содержащий последовательность команд.
# script.ps1
param(
[string]$OutputFile
)
Write-Host "Запуск скрипта..."
$Данные = Get-Content -Path "Данные.txt"
$Данные | Out-File -FilePath $OutputFile
Write-Host "Готово."
Область видимости переменных
| Уровень | Описание |
|---|---|
Local | Доступна внутри функции или скрипта |
Script | Доступна во всем скрипте |
Global | Доступна глобально во всей сессии |
Private | Доступна только в текущем блоке кода |
$global:MyVar = "Глобальная"
function Test-Var {
$script:MyVar = "Скриптовая"
$local:MyVar = "Локальная"
Write-Host "Глобальная: $global:MyVar"
Write-Host "Скриптовая: $script:MyVar"
Write-Host "Локальная: $local:MyVar"
}
Обработка ошибок и исключений
Типы ошибок
| Тип | Описание |
|---|---|
Terminating Error | Ошибка, останавливающая выполнение потока |
Non-Terminating Error | Ошибка, не останавливающая выполнение потока |
Блок try-catch-finally
Использование для перехвата исключений.
try {
$file = Get-Content -Path "nonexistent.txt"
}
catch [Система.IO.FileNotFoundException] {
Write-Host "Файл не найден: $_"
}
catch {
Write-Host "Произошла ошибка: $($_.Exception.Message)"
}
finally {
Write-Host "Блок finally выполняется всегда"
}
Объект ошибки $_.Exception
Внутри блока catch переменная $_ содержит объект исключения.
| Свойство | Описание |
|---|---|
.Message | Текст сообщения об ошибке |
.Exception | Сам объект исключения |
.InvocationInfo | Информация о вызове команды |
.Line | Строка кода, вызвавшая ошибку |
.PositionMessage | Точное положение ошибки |
Параметр -ErrorAction
Управление реакцией на ошибки.
| Значение | Описание |
|---|---|
Continue | Стандартное поведение (вывод ошибки в stderr) |
SilentlyContinue | Игнорировать ошибку, ничего не выводить |
Stop | Вызвать terminating error |
Inquire | Запросить действие у пользователя |
Ignore | Игнорировать ошибку (аналог Silent) |
Get-Item -Path "missing" -ErrorAction SilentlyContinue
Объекты и конвейер (Pipeline)
Объекты в PowerShell
Все данные в PowerShell являются объектами .NET.
| Характеристика | Описание |
|---|---|
| Тип объекта | Определяется классом .NET |
| Свойства | Данные внутри объекта |
| Методы | Функции объекта |
| Members | Совокупность свойств и методов |
Конвейер
Передача объектов между командами.
Get-Process | Where-Object {$_.CPU -gt 100} | Select-Object Name, CPU, Id
Коммандлеты для работы с объектами
| Коммандлет | Назначение |
|---|---|
Select-Object | Выбор свойств и создание новых объектов |
Where-Object | Фильтрация объектов по условию |
Sort-Object | Сортировка объектов |
Group-Object | Группировка объектов по свойству |
Measure-Object | Подсчет количества, суммы, среднего |
Format-Table | Форматирование вывода в таблицу |
Format-List | Форматирование вывода в список |
Out-File | Запись результатов в файл |
Export-Csv | Экспорт в CSV формат |
ConvertTo-Json | Конвертация в JSON строку |
ConvertFrom-Json | Парсинг JSON в объекты |
Создание объектов вручную
$person = [PSCustomObject]@{
Name = "Timur"
Age = 31
Skills = @("C#", "Python", "SQL")
}
$person | Format-List
Работа с внешними ресурсами
Внешние команды (CMD, EXE)
PowerShell может запускать стандартные команды ОС.
# Запуск CMD
cmd /c dir
# Запуск EXE
notepad.exe file.txt
# Получение вывода
$output = cmd /c "echo Hello"
WMI и CIM
Интерфейсы для управления системой.
| Коммандлет | Описание |
|---|---|
Get-WmiObject | Получение данных WMI (устаревший, но рабочий) |
Get-CimInstance | Получение данных CIM (современный стандарт) |
Invoke-CimMethod | Вызов метода WMI/CIM |
Register-CimIndicationEvent | Регистрация событий |
# Получение информации о BIOS
Get-CimInstance Win32_BIOS
# Получение списка служб
Get-CimInstance Win32_Service | Where-Object {$_.State -eq "Running"}
REST API и веб-запросы
# GET запрос
$response = Invoke-RestMethod -Uri "https://api.example.com/Данные" -Method Get
# POST запрос
$body = @{ key = "value" } | ConvertTo-Json
$headers = @{ "Authorization" = "Bearer token" }
$result = Invoke-RestMethod -Uri "https://api.example.com/Данные" -Method Post -Body $body -Headers $headers
XML и JSON
# Работа с XML
$xmlData = @"
<Root>
<Item id="1">Text</Item>
</Root>
"@
$xml = [xml]$xmlData
$item = $xml.Root.Item
Write-Host $item.Id
# Работа с JSON
$jsonString = '{"Name": "Test", "Value": 123}'
$jsonObj = $jsonString | ConvertFrom-Json
Write-Host $jsonObj.Name
Модули и профили
Структура модуля
Модуль — это пакет с функциями, переменными и скриптами.
| Файл | Расширение | Назначение |
|---|---|---|
| Модуль | .psm1 | Основной код модуля |
| Скрипт | .ps1 | Вспомогательные скрипты |
| Документация | .md | Описание модуля |
| Помощь | .help.xml | Встроенная справка |
Профили PowerShell
Файлы конфигурации, загружаемые при старте сессии.
| Путь | Описание |
|---|---|
$PROFILE.CurrentUserCurrentHost | Профиль текущего пользователя для текущего хоста |
$PROFILE.CurrentUserAllHosts | Профиль текущего пользователя для всех хостов |
$PROFILE.AllUsersCurrentHost | Профиль всех пользователей для текущего хоста |
$PROFILE.AllUsersAllHosts | Профиль всех пользователей для всех хостов |
# Создание профиля
if (!(Test-Path $PROFILE)) {
New-Item -ItemType File -Path $PROFILE -Force
}
# Редактирование профиля
notepad $PROFILE
Импорт модулей
# Импорт модуля по имени
Import-Module ActiveDirectory
# Импорт модуля из пути
Import-Module -Path "C:\Scripts\MyModule.psm1"
# Автоматический импорт при старте
$env:PSModulePath += ";C:\CustomModules"
Продвинутые темы
Job и Background Задачи
Выполнение операций в фоновом режиме.
| Коммандлет | Описание |
|---|---|
Start-Job | Запуск фоновой задачи |
Receive-Job | Получение результатов задачи |
Remove-Job | Удаление задачи |
Wait-Job | Ожидание завершения задачи |
Get-Job | Список активных задач |
$job = Start-Job -ScriptBlock { Start-Sleep -Seconds 5; return "Done" }
Start-Sleep -Seconds 1
$job | Receive-Job
Привилегии и безопасность
| Концепция | Описание |
|---|---|
RunAsAdministrator | Запуск консоли с правами администратора |
ExecutionPolicy | Политика выполнения скриптов (Restricted, RemoteSigned, AllSigned, Unrestricted) |
CodeSigning | Подписание скриптов цифровыми сертификатами |
SecurityContext | Контекст безопасности для выполнения кода |
# Установка политики выполнения
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
Интерактивные элементы
| Коммандлет | Описание |
|---|---|
Read-Host | Ввод текста пользователем |
Write-Progress | Отображение прогресс-бара |
Write-Host | Вывод текста в консоль |
Write-Warning | Вывод предупреждения (желтый цвет) |
Write-Error | Вывод ошибки (красный текст) |
Write-Information | Вывод информационной информации |
Write-Progress -Activity "Загрузка" -Status "Обработка данных" -PercentComplete 50
$answer = Read-Host "Введите пароль"
Полезные шаблоны и паттерны
Паттерн "Try-Catch-Finally" для файлов
function Process-File {
param([string]$Path)
try {
$content = Get-Content -Path $Path -ErrorAction Stop
# Обработка
}
catch {
Write-Error "Ошибка чтения файла: $Path"
}
finally {
# Очистка ресурсов
}
}
Паттерн "Pipeline Processing"
function Get-ProcessedItems {
param([string]$Source)
begin {
Write-Verbose "Начало обработки"
}
process {
# Обработка каждого элемента конвейера
$_ | ForEach-Object {
# Логика
}
}
end {
Write-Verbose "Завершение обработки"
}
}
Паттерн "Configuration Management"
$config = @{
Servers = @("Server1", "Server2")
Ports = 80, 443
Timeout = 30
}
foreach ($server in $config.Servers) {
foreach ($port in $config.Ports) {
Test-NetConnection -ComputerName $server -Port $port -TimeoutSec $config.Timeout
}
}
См. также
Другие статьи этого же раздела в боковом меню (как на странице «О разделе»). Архитектура PowerShell построена вокруг концепции командлетов (cmdlet). Каждая команда представляет собой отдельный класс, реализующий определенный функционал. Командлеты следуют единообразному… Для дистрибутивов на основе Debian (Ubuntu, Debian, Kali) используется команда apt, для Red Hat Enterprise Linux и CentOS — yum или dnf. Процесс установки включает добавление репозитория Microsoft,… Набор советов, правил, принципов и обычаев в разработке на этом языке. PowerShell — это кроссплатформенная оболочка командной строки и язык сценариев, созданный компанией Microsoft для автоматизации администрирования операционных систем. Инструмент сочетает в себе… Как устроены команды и принципы построения скриптов в PowerShell $this — переменная, указывающая на текущий объект в методах классов. В PowerShell переменная $this используется внутри методов для обращения к свойствам и методам текущего экземпляра класса. Командлет — это функция, реализованная в виде класса .NET, который предоставляет единый интерфейс для выполнения конкретных задач в среде PowerShell. Термин представляет собой сокращение от… Типизация, набор правил определения типа данных значений языка. Основой условной логики служит проверка истинности выражения. Результатом такой проверки является булево значение True (истина) или False (ложь). Скрипт использует эти значения для выбора ветки… Функция в среде PowerShell представляет собой именованный блок кода, который выполняет конкретную задачу и может быть вызван многократно из разных частей скрипта или консоли. Создание функции… Для динамического добавления свойств используется cmdlet Add-Member. Это позволяет расширять функциональность объектов без изменения их исходного кода. PowerShell — это среда командной строки и язык сценариев, разработанный для автоматизации администрирования систем Windows. В отличие от классических языков программирования, где обработка ошибок…История PowerShell
Экосистема автоматизации на PowerShell
Рекомендации по написанию PowerShell-скриптов
Основы языка PowerShell
Синтаксис и операторы PowerShell
Ключевые слова и управляющие конструкции
Командлеты и встроенные функции PowerShell
Типы данных и работа с переменными
Условные выражения и циклы
Функции и продвинутые параметры
Объектная модель и конвейерная обработка
Обработка ошибок и стратегии отладки