Справочник по PowerShell
Play ITЗагрузка интерактивного демо…
Справочник по 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 | Поток входных данных, поступающих в текущий блок кода |
$Error | Массив последних объектов ошибок в текущей сессии |
$PSCmdlet | Контекст advanced-функции (внутри [CmdletBinding()]) |
Синтаксис объявления переменных
Переменные объявляются с использованием символа $.
Код ITЗагрузка примера кода…
Операторы и выражения
Арифметические операторы
Операторы выполняют математические действия над числами.
| Оператор | Действие | Пример | Результат |
|---|---|---|---|
+ | Сложение | 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) |
| ` | ` | Передача объекта следующему командлету |
System.Collections.Generic.List[T] (.NET):
| Действие | Метод |
|---|---|
| Добавить в конец | Add(value) |
| Вставить | Insert(index, value) |
| Прочитать / заменить | $list[index] |
| Удалить по индексу | RemoveAt(index) |
Hashtable / словарь — $h[key] = val, $h[key], $h.Remove(key).
Командлеты и их параметры
Общие принципы работы
Каждый командлет 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
}
Функции и скрипты
Определение функций
Функция — это именованный блок кода, который можно вызывать многократно.
Код ITЗагрузка примера кода…
Параметры функций
Параметры могут иметь ограничения и значения по умолчанию.
| Тип параметра | Описание |
|---|---|
[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 "Запуск скрипта..."
$data = Get-Content -Path "data.txt"
$data | 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 [System.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 | Совокупность свойств и методов |
Конвейер
Передача объектов между командами (поток Success). Подробнее — основы, углублённо — объектная модель.
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/data" -Method Get
# POST запрос
$body = @{ key = "value" } | ConvertTo-Json
$headers = @{ "Authorization" = "Bearer token" }
$result = Invoke-RestMethod -Uri "https://api.example.com/data" -Method Post -Body $body -Headers $headers
XML и JSON
Код ITЗагрузка примера кода…
Модули и профили
Структура модуля
Модуль — это пакет с функциями, переменными и скриптами.
| Файл | Расширение | Назначение |
|---|---|---|
| Модуль | .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"
Код ITЗагрузка примера кода…
Паттерн "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
}
}
Базовый разбор HTTP и HTTPS находится в отдельной статье — HTTP как основа веб-интеграций.
Как пользоваться этим справочником на практике
Этот материал лучше использовать как рабочую карту:
- сначала открыть нужный блок (операторы, команды, ошибки);
- затем сразу проверить пример в консоли;
- после этого встроить фрагмент в свой скрипт.
Если статья кажется слишком плотной, идите через связанный маршрут:
Дальше — модули, удалённое администрирование и автоматизация в Windows.