Ключевые слова и управляющие конструкции
Play ITЗагрузка интерактивного демо…
Ключевые слова и управляющие конструкции
Справочник по синтаксическим словам PowerShell. Развёрнутые if/switch/циклы — в условиях и циклах; операторы сравнения — в синтаксисе.
Базовые ключевые слова
$true и $false — встроенные переменные, представляющие логические значения истина и ложь. Эти значения используются в условных операторах и логических выражениях. Значение $true соответствует значению 1, а $false — значению 0. При сравнении числовых значений или строк система автоматически преобразует результат в один из этих двух типов.
if ($true) {
Write-Host "Это условие истинно"
}
if ($false) {
Write-Host "Этот код не выполнится"
}
$null — специальное значение, обозначающее отсутствие объекта или пустоту. В PowerShell отсутствие значения не равно нулю или пустой строке. Это отдельный тип данных, указывающий на то, что переменная не содержит никакого объекта. Проверка на $null является стандартным способом определения наличия или отсутствия данных в переменной.
$variable = $null
if ($variable -eq $null) {
Write-Host "Переменная пуста"
}
$args — встроенный массив, содержащий аргументы, переданные в функцию или скрипт при отсутствии явного объявления параметров. Этот массив доступен внутри любой функции и содержит все дополнительные параметры, которые не были сопоставлены с объявленными параметрами функции.
function Show-Args {
foreach ($arg in $args) {
Write-Output $arg
}
}
Show-Args "Первый" "Второй" "Третий"
$env: — префикс для доступа к переменным среды операционной системы. Через этот механизм можно читать и изменять системные переменные, такие как путь к исполняемым файлам, имя пользователя или текущая рабочая директория. Префикс $env: открывает доступ к провайдеру Env, который представляет собой набор переменных среды.
Write-Output $env:Path
Write-Output $env:UserName
$home — встроенная переменная, содержащая путь к домашней директории текущего пользователя. Значение этой переменной зависит от операционной системы и может быть C:\Users\ИмяПользователя в Windows или /home/имя_пользователя в Linux/MacOS. Эта переменная упрощает работу с путями к пользовательским файлам и папкам.
Write-Output $home
$PID — встроенная переменная, содержащая идентификатор процесса (Process ID) текущего экземпляра PowerShell. Значение изменяется при каждом запуске новой сессии оболочки. Идентификатор используется для управления процессами, мониторинга активности и отладки скриптов.
Write-Output "Текущий PID: $PID"
$PSHOME — встроенная переменная, указывающая на полный путь к директории установки PowerShell. Это системная переменная, которая всегда указывает на корневую папку, где размещены исполняемые файлы и модули оболочки.
Write-Output $PSHOME
$PWD — встроенная переменная, содержащая текущую рабочую директорию. Значение обновляется автоматически при переходе в другую папку с помощью команды Set-Location или cd. Переменная возвращает объект типа System.IO.DirectoryInfo, содержащий информацию о пути.
Write-Output $PWD
$PSVersionTable — встроенная переменная, содержащая таблицу версий компонентов PowerShell. Объект включает информацию о версии самой оболочки, платформы CLR, поддерживаемых протоколов и других технических характеристиках.
$PSVersionTable.PSVersion
Ключевые слова для работы с переменными и типами данных
[type] — оператор приведения типов, используемый для явного преобразования значения одного типа в другой. Оператор заключается в квадратные скобки и ставится перед значением или переменной. Приведение типов может происходить автоматически, но явное указание типа повышает надежность скрипта и предотвращает ошибки при работе с данными.
[string]$text = 12345
[int]$number = "67890"
[bool]$isTrue = "true"
[hashtable] — оператор создания хеш-таблицы, представляющей коллекцию пар ключ-значение. Хеш-таблицы используются для хранения структурированных данных, где каждый элемент имеет уникальный ключ для быстрого доступа. Создание хеш-таблицы осуществляется через конструкцию @{}.
$person = @{
Name = "Ivan"
Age = 30
City = "Moscow"
}
[array] — оператор создания массива, представляющего упорядоченную коллекцию элементов одинакового или разного типа. Массивы создаются через запятую или через конструкцию @(). Элементы массива доступны по индексу, начиная с нуля.
$numbers = 1, 2, 3, 4, 5
$mixedArray = @("text", 123, $true)
[string] — оператор указания типа данных строка. Используется для явного объявления переменных, содержащих текстовые данные. Строки в PowerShell заключаются в кавычки (одинарные или двойные), причем двойные кавычки позволяют использовать подстановку переменных.
[string]$message = "Привет, мир!"
[string]$greeting = "Привет, $name"
[int], [long], [double], [decimal] — операторы указания числовых типов данных. Каждый тип предназначен для определенных диапазонов значений и точности вычислений. Тип int подходит для целых чисел, double — для чисел с плавающей точкой, decimal — для финансовых расчетов с высокой точностью.
[int]$count = 100
[double]$pi = 3.14159
[decimal]$price = 19.99
[datetime] — оператор указания типа данных дата и время. Позволяет работать с временными метками, проводить операции сложения и вычитания времени, форматировать вывод даты. Объекты DateTime содержат информацию о годе, месяце, дне, часе, минуте и секунде.
[datetime]$now = Get-Date
[datetime]$future = $now.AddDays(7)
[scriptblock] — оператор создания блока кода, который выполняется позже. Скрипт-блок инкапсулирует код и позволяет передавать его как аргумент в другие функции или выполнять в определенном контексте. Скрипт-блоки заключаются в фигурные скобки {}.
$scriptBlock = { Write-Output "Выполняется позже" }
& $scriptBlock
Ключевые слова для управления потоком выполнения
if, elseif, else — операторы условного ветвления, позволяющие выбирать различные пути выполнения кода в зависимости от результата проверки условия. Конструкция if проверяет первое условие, elseif добавляет дополнительные условия, а else выполняет блок кода, если ни одно из предыдущих условий не истинно.
$score = 85
if ($score -ge 90) {
Write-Output "Отлично"
} elseif ($score -ge 75) {
Write-Output "Хорошо"
} elseif ($score -ge 60) {
Write-Output "Удовлетворительно"
} else {
Write-Output "Неудовлетворительно"
}
switch — оператор выбора, выполняющий сравнение значения с множеством возможных вариантов. Конструкция switch поддерживает точное совпадение, регулярные выражения и проверку условий. Каждый случай (case) может содержать свой блок кода для выполнения.
$day = "Monday"
switch ($day) {
"Monday" { Write-Output "Начало недели" }
"Friday" { Write-Output "Конец рабочей недели" }
default { Write-Output "Обычный день" }
}
for — оператор цикла с фиксированным количеством итераций. Цикл for использует три компонента: инициализацию счетчика, условие продолжения и шаг изменения счетчика. Цикл выполняется до тех пор, пока условие остается истинным.
for ($i = 0; $i -lt 5; $i++) {
Write-Output "Итерация номер $i"
}
foreach — оператор цикла для перебора элементов коллекции. Цикл foreach автоматически проходит по каждому элементу массива, списка или другого объекта, поддерживающего итерацию. Внутри цикла переменная принимает значение текущего элемента.
$fruits = @("Apple", "Banana", "Orange")
foreach ($fruit in $fruits) {
Write-Output "Фрукт: $fruit"
}
while — оператор цикла с проверкой условия перед каждой итерацией. Цикл while продолжает выполнение, пока условие остается истинным. Если условие изначально ложно, тело цикла не выполнится ни разу.
$count = 0
while ($count -lt 5) {
Write-Output "Счетчик: $count"
$count++
}
do...while — оператор цикла с проверкой условия после выполнения тела цикла. Цикл do...while гарантирует выполнение тела хотя бы один раз, так как проверка условия происходит после первой итерации.
$count = 0
do {
Write-Output "Счетчик: $count"
$count++
} while ($count -lt 5)
break — оператор прерывания цикла или оператора switch. При выполнении команды break управление передается следующей инструкции после завершающего блока цикла или переключателя.
for ($i = 0; $i -lt 10; $i++) {
if ($i -eq 5) {
break
}
Write-Output "Значение: $i"
}
continue — оператор пропуска текущей итерации цикла и перехода к следующей. Команда continue прекращает выполнение оставшейся части тела цикла для текущей итерации и сразу переходит к проверке условия продолжения.
for ($i = 0; $i -lt 10; $i++) {
if ($i % 2 -eq 0) {
continue
}
Write-Output "Нечетное число: $i"
}
return — оператор выхода из функции или скрипта. Команда return немедленно завершает выполнение текущего блока кода и передает управление обратно вызывающему коду. Значение после return возвращается как результат выполнения функции.
function Get-Square {
param([int]$number)
return $number * $number
}
$result = Get-Square 5
Write-Output $result
Ключевые слова для работы с исключениями
try, catch, finally — перехват сбоев; throw — явное исключение; $ErrorActionPreference — поведение по умолчанию (Continue, Stop, SilentlyContinue); $LastExitCode — код выхода последней внешней программы (ping, git), не встроенного командлета.
try {
Get-Content .\missing.txt -ErrorAction Stop
} catch {
Write-Warning $_
} finally {
Write-Verbose 'Завершение блока'
}
$ErrorActionPreference = 'Stop' # осторожно: влияет на всю сессию
Подробно — поток Error, -ErrorAction на команде, Get-Error — обработка ошибок.
Ключевые слова для работы с модулями и функциями
function — оператор объявления функции. Функция инкапсулирует набор команд и позволяет вызывать их многократно с разными параметрами. Объявление функции начинается с ключевого слова function за которым следует имя функции.
function Add-Numbers {
param([int]$a, [int]$b)
return $a + $b
}
$result = Add-Numbers 5 10
Write-Output $result
param — оператор объявления параметров функции. Конструкция param определяет имена, типы и значения параметров по умолчанию, принимаемых функцией. Параметры могут быть обязательными или опциональными.
function Greet {
param(
[string]$Name,
[string]$Title = "Mr."
)
Write-Output "$Title $Name"
}
Greet -Name "Ivan"
Greet -Name "Maria" -Title "Ms."
filter — оператор создания фильтра для обработки потока данных. Фильтр работает в конвейере и применяет логику к каждому входящему объекту. Фильтры отличаются от функций тем, что предназначены для обработки потоков данных.
filter Format-Currency {
"{0:C}" -f $_
}
100, 200, 300 | Format-Currency
begin, process, end — блоки внутри функции или фильтра, определяющие этапы обработки данных. Блок begin выполняется один раз перед обработкой первого объекта. Блок process выполняется для каждого объекта в потоке. Блок end выполняется один раз после обработки всех объектов.
function Process-Data {
begin {
Write-Output "Начало обработки"
}
process {
Write-Output "Обработка объекта: $_"
}
end {
Write-Output "Завершение обработки"
}
}
1, 2, 3 | Process-Data
using module, import-module, export-module-member — операторы работы с модулями PowerShell. Модули представляют собой наборы функций, переменных и других элементов, упакованных в единый пакет. Операторы позволяют импортировать внешние модули, экспортировать компоненты и управлять зависимостями.
Import-Module Microsoft.PowerShell.Utility
Export-ModuleMember -Function Get-MyCommand
using module — подключает модуль на этапе разбора скрипта (удобно для классов и типов из модуля). Import-Module загружает командлеты и функции в текущую сессию.
Import-Module Microsoft.PowerShell.Security
Get-Command -Module Microsoft.PowerShell.Security
Специальные ключевые слова
$PSCulture, $PSUICulture — переменные, содержащие информацию о региональных настройках текущей сессии PowerShell. Значения влияют на форматирование дат, чисел, валют и других локализованных данных.
Write-Output $PSCulture
Write-Output $PSUICulture
$ExecutionContext — объект, содержащий контекст выполнения текущего скрипта. Объект предоставляет доступ к информации о текущей сессии, системе безопасности и других параметрах выполнения.
Write-Output $ExecutionContext.SessionState.Path.CurrentLocation
$input — встроенный поток, содержащий входные данные, переданные в скрипт или функцию через конвейер. Поток input позволяет обрабатывать данные, поступающие извне, без явного объявления параметров.
$numbers = 1, 2, 3, 4, 5 | ForEach-Object { $_ * 2 }
$myinvocation — объект, содержащий информацию о текущем вызове скрипта или функции. Объект включает имя скрипта, номер строки, путь к файлу и другие детали вызова.
Write-Output $myinvocation.ScriptName
Write-Output $myinvocation.Line
$psitem — переменная, используемая в конвейере для обозначения текущего обрабатываемого объекта. Переменная заменяет символ $_ в некоторых случаях для повышения читаемости кода.
Get-ChildItem | ForEach-Object {
$psitem.FullName
}
$this — переменная, указывающая на текущий объект в методах классов. В PowerShell переменная $this используется внутри методов для обращения к свойствам и методам текущего экземпляра класса.
class Calculator {
[int] $Value
Calculator([int]$initialValue) {
$this.Value = $initialValue
}
[void] Add([int]$amount) {
$this.Value += $amount
}
}
Управляющие конструкции PowerShell
В начале статьи уже разобраны ключевые слова (if, elseif, else, switch, for, foreach, while, do/until, break, continue, return) с короткими примерами. Ниже — как не дублировать материал других глав и куда смотреть углублённо.
| Тема | Статья |
|---|---|
Операторы -eq, -like, -match, -in, логика -and/-or | Синтаксис и операторы |
if / switch / циклы, производительность, практика | Условия и циклы |
| Потоки вывода, конвейер ` | `, провайдеры |
$_, ForEach-Object, изменение объектов в pipeline | Объектная модель |
Сводка для условий
Код ITЗагрузка примера кода…
Конвейер вместо лишних циклов
Если данные идут из командлета, объединяйте фильтр и действие в цепочке, а не в foreach с if на каждой строке:
Get-Service |
Where-Object Status -eq 'Stopped' -and StartType -eq 'Automatic' |
ForEach-Object {
Start-Service $_.Name -ErrorAction SilentlyContinue
}
Оператор foreach ($x in $arr) оставляйте для коллекций, собранных в скрипте (массивы, результаты Import-Csv, ключи хеш-таблицы).
Полезные приёмы
- Dot sourcing —
. .\functions.ps1загружает функции в текущую область видимости. - Here-strings —
@" ... "@для многострочного текста с подстановкой переменных. - Вызов скрипт-блока —
& $scriptBlockили& "C:\path\script.ps1". - Подстановка в строках —
"Hello, $name!", границы имени:"${value}extra".
. .\lib\Common.ps1
$block = { param($x) $x * 2 }
1..3 | ForEach-Object { & $block $_ }
Обработка ошибок и исключений
Ключевые слова try, catch, finally, throw и переменная $ErrorActionPreference описаны выше в этой же статье. Полная теория — terminating и non-terminating ошибки, $Error, -ErrorAction, логирование — в обработке ошибок.
try {
Get-Content .\config.json -ErrorAction Stop
} catch [System.Management.Automation.ItemNotFoundException] {
Write-Warning 'Конфиг не найден — значения по умолчанию'
} catch {
Write-Error "Сбой чтения: $($_.Exception.Message)"
}
Практические примеры использования
Пример 1 — Обработка файлов с условиями
Код ITЗагрузка примера кода…
Пример 2 — Цикл с обработкой ошибок
Код ITЗагрузка примера кода…
Пример 3 — Фильтрация и группировка (конвейер)
Get-Process |
Where-Object CPU -gt 10 |
Group-Object Name |
ForEach-Object { "$($_.Name): $($_.Count) экз." }
Пример 4 — Работа с параметрами функции
Код ITЗагрузка примера кода…
Пример 5 — Цепочка конвейера
1..100 |
Where-Object { $_ % 2 -eq 0 } |
ForEach-Object { $_ * 2 } |
Sort-Object -Descending |
Select-Object -First 5