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

Ключевые слова и управляющие конструкции

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

Ключевые слова и управляющие конструкции

Базовые ключевые слова

$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. Переменная возвращает объект типа Система.IO.DirectoryInfo, содержащий информацию о пути.

Write-Output $PWD

$PSVersionTable — встроенная переменная, содержащая таблицу версий компонентов PowerShell. Объект включает информацию о версии самой оболочки, платформы CLR, поддерживаемых протоколов и других технических характеристиках.

$PSVersionTable.PSVersion

Ключевые слова для работы с переменными и типами данных

[type] — оператор приведения типов, используемый для явного преобразования значения одного типа в другой. Оператор заключается в квадратные скобки и precedes значение или переменную. Приведение типов может происходить автоматически, но явное указание типа повышает надежность скрипта и предотвращает ошибки при работе с данными.

[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 — конструкция обработки исключений, обеспечивающая надежное выполнение кода при возникновении ошибок. Блок try содержит код, который может вызвать ошибку. Блок catch перехватывает и обрабатывает возникшее исключение. Блок finally выполняется всегда, независимо от того, произошло ли исключение.

try {
$result = 10 / 0
} catch {
Write-Output "Произошла ошибка: $_"
} finally {
Write-Output "Блок finally выполнен"
}

throw — оператор генерации исключения. Команда throw создает объект исключения и передает управление блоку catch. Исключение может быть создано вручную для сигнализации об ошибке в логике скрипта.

function Check-Age {
param([int]$age)

if ($age -lt 18) {
throw "Возраст должен быть не менее 18 лет"
}

Write-Output "Доступ разрешен"
}

try {
Check-Age 15
} catch {
Write-Output "Ошибка: $_"
}

$ErrorActionPreference — системная переменная, определяющая поведение PowerShell при возникновении ошибок. Значение может быть Stop (остановить выполнение), Continue (продолжить выполнение), SilentlyContinue (игнорировать ошибку), Inquire (запросить действие пользователя).

$ErrorActionPreference = "Stop"

Get-Content "nonexistent.txt"

$LastExitCode — встроенная переменная, содержащая код выхода последней внешней команды. Код выхода равен 0, если команда завершилась успешно, и ненулевое значение в случае ошибки. Переменная доступна только после выполнения внешних программ.

netstat | Out-Null
Write-Output $LastExitCode

Ключевые слова для работы с модулями и функциями

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-Данные {
begin {
Write-Output "Начало обработки"
}
process {
Write-Output "Обработка объекта: $_"
}
end {
Write-Output "Завершение обработки"
}
}

1, 2, 3 | Process-Данные

using module, import-module, export-module-member — операторы работы с модулями PowerShell. Модули представляют собой наборы функций, переменных и других элементов, упакованных в единый пакет. Операторы позволяют импортировать внешние модули, экспортировать компоненты и управлять зависимостями.

Import-Module Microsoft.PowerShell.Utility
Export-ModuleMember -Function Get-MyCommand

inmodule, incommand — операторы для выполнения кода в контексте конкретного модуля или команды. Эти операторы позволяют обращаться к внутренним элементам модулей, которые иначе недоступны из глобальной области видимости.

inmodule Microsoft.PowerShell.Безопасность {
Get-Help about_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

Условные операторы

Условные операторы позволяют принимать решения в зависимости от состояния данных. В PowerShell реализованы несколько видов условий, работающих с объектами и значениями.

Оператор if — основная конструкция для проверки условий. Синтаксис включает название условия в круглых скобках и блок кода в фигурных скобках. Условие должно возвращать логическое значение true или false.

$temperature = 25

if ($temperature -gt 20) {
Write-Output "Тепло"
}

if ($temperature -le 10) {
Write-Output "Холодно"
}

Оператор switch — альтернатива множественным условиям if-elseif. Switch сравнивает значение с несколькими вариантами и выполняет соответствующий блок кода. Поддерживает регулярные выражения и проверку условий.

$status = "active"

switch ($status) {
"active" { Write-Output "Статус активен" }
"inactive" { Write-Output "Статус неактивен" }
"pending" { Write-Output "Статус ожидает" }
default { Write-Output "Неизвестный статус" }
}

Оператор ternary (условный оператор) — компактная форма записи условия. В PowerShell нет отдельного синтаксиса ternary, но аналогичная функциональность реализуется через комбинацию if и else в одной строке.

$age = 20
$result = if ($age -ge 18) { "Совершеннолетний" } else { "Несовершеннолетний" }
Write-Output $result

Оператор -and, -or, -not — логические операторы для объединения условий. Оператор -and возвращает true, если оба условия истинны. Оператор -or возвращает true, если хотя бы одно условие истинно. Оператор -not инвертирует логическое значение.

$age = 25
$hasLicense = $true

if ($age -ge 18 -and $hasLicense) {
Write-Output "Доступ разрешен"
}

if ($age -lt 18 -or -not $hasLicense) {
Write-Output "Доступ запрещен"
}

Оператор -eq, -ne, -gt, -ge, -lt, -le — операторы сравнения. -eq проверяет равенство, -ne — неравенство, -gt — больше, -ge — больше или равно, -lt — меньше, -le — меньше или равно. Сравнение работает с объектами и учитывает их типы.

$a = 10
$b = 20

if ($a -lt $b) {
Write-Output "A меньше B"
}

if ($a -ne $b) {
Write-Output "A не равно B"
}

Оператор -like, -match, -contains — операторы поиска и проверки содержимого. -like проверяет соответствие шаблону с использованием символов подстановки. -match проверяет соответствие регулярному выражению. -contains проверяет наличие элемента в коллекции.

$name = "John Doe"

if ($name -like "*Doe*") {
Write-Output "Фамилия содержит Doe"
}

if ($name -match "^\w+\s+\w+$") {
Write-Output "Имя соответствует формату"
}

$colors = @("red", "green", "blue")

if ($colors -contains "green") {
Write-Output "Цвет зеленый найден"
}

Циклические конструкции

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

Цикл for — цикл с фиксированным количеством итераций. Содержит три части: инициализацию, условие продолжения и изменение счетчика. Цикл выполняется до тех пор, пока условие истинно.

for ($i = 1; $i -le 10; $i++) {
Write-Output "Число: $i"
}

Цикл foreach — цикл для перебора элементов коллекции. Автоматически проходит по каждому элементу массива, списка или другого итерируемого объекта. Внутри цикла переменная принимает значение текущего элемента.

$items = @("apple", "banana", "cherry")

foreach ($item in $items) {
Write-Output "Фрукт: $item"
}

Цикл while — цикл с проверкой условия перед каждой итерацией. Продолжает выполнение, пока условие истинно. Если условие изначально ложно, тело цикла не выполнится.

$count = 0

while ($count -lt 5) {
Write-Output "Счетчик: $count"
$count++
}

Цикл do-while — цикл с проверкой условия после выполнения тела. Гарантирует выполнение хотя бы одной итерации, так как проверка происходит после первого прохода.

$count = 0

do {
Write-Output "Счетчик: $count"
$count++
} while ($count -lt 5)

Цикл foreach-object — специализированная форма цикла для работы с конвейером. Используется в сочетании с оператором ForEach-Object для обработки каждого объекта, проходящего через конвейер.

1..10 | ForEach-Object {
Write-Output "Объект: $_"
}

Цикл until — цикл с проверкой условия на ложность. Выполняется, пока условие ложно, и останавливается, когда условие становится истинным. Аналогичен do-while с инвертированным условием.

$answer = ""

until ($answer -eq "exit") {
$answer = Read-Host "Введите 'exit' для выхода"
Write-Output "Вы ввели: $answer"
}

Управление потоком выполнения

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

Break — принудительное завершение цикла или переключателя. При встрече с break выполнение текущего цикла прекращается, и управление передается следующей команде после цикла.

for ($i = 0; $i -lt 10; $i++) {
if ($i -eq 5) {
break
}
Write-Output "Значение: $i"
}

Continue — пропуск текущей итерации и переход к следующей. Остальная часть тела цикла не выполняется, и цикл сразу переходит к проверке условия продолжения.

for ($i = 0; $i -lt 10; $i++) {
if ($i % 2 -eq 0) {
continue
}
Write-Output "Нечетное число: $i"
}

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

function Calculate-Sum {
param([int[]]$numbers)

if ($null -eq $numbers) {
return 0
}

return $numbers | Measure-Object -Sum | Select-Object -ExpandProperty Sum
}

$result = Calculate-Sum 1, 2, 3, 4, 5
Write-Output $result

Throw — генерация исключения. Создает объект исключения и передает управление блоку catch. Используется для сигнализации об ошибке в логике скрипта.

function Validate-Age {
param([int]$age)

if ($age -lt 0) {
throw "Возраст не может быть отрицательным"
}

if ($age -gt 150) {
throw "Возраст слишком большой"
}

Write-Output "Возраст валиден"
}

try {
Validate-Age -20
} catch {
Write-Output "Ошибка: $_"
}

Try-Catch-Finally — конструкция обработки ошибок. Блок try содержит код, который может вызвать ошибку. Блок catch перехватывает и обрабатывает исключение. Блок finally выполняется всегда.

try {
$file = Get-Content "Данные.txt"
Write-Output "Файл прочитан"
} catch {
Write-Output "Ошибка чтения файла: $_"
} finally {
Write-Output "Завершение обработки файла"
}

Работа с объектами и коллекциями

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

Select-Object — команда фильтрации и выборки свойств объектов. Позволяет выбрать конкретные свойства, применить преобразование или выполнить сортировку.

Get-Process | Select-Object Name, Id, CPU | Where-Object { $_.CPU -gt 10 }

Where-Object — команда фильтрации объектов по условию. Проверяет каждый объект и оставляет только те, которые соответствуют заданному условию.

$users = @(@{Name="Ivan"; Age=25}, @{Name="Maria"; Age=17})

$adults = $users | Where-Object { $_.Age -ge 18 }

Sort-Object — команда сортировки объектов по указанному свойству. Поддерживает сортировку по возрастанию и убыванию, а также сортировку по нескольким полям.

$files = Get-ChildItem | Sort-Object Length -Descending

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

$files = Get-ChildItem | Group-Object Extension

Measure-Object — команда подсчета и агрегации данных. Подсчитывает количество объектов, сумму, среднее значение и другие статистические показатели.

$numbers = 1, 2, 3, 4, 5
$sum = $numbers | Measure-Object -Sum
Write-Output $sum.Sum

ForEach-Object — команда применения операции к каждому объекту в потоке. Аналогична циклу foreach, но работает непосредственно с конвейером.

1..5 | ForEach-Object {
$_ * 2
}

Foreach — оператор цикла для перебора коллекций. Работает аналогично ForEach-Object, но может использоваться в любом месте кода, не только в конвейере.

$items = @("a", "b", "c")

foreach ($item in $items) {
Write-Output $item.ToUpper()
}

Специальные конструкции

Pipeline — механизм передачи объектов между командами. Результат выполнения одной команды передается на вход следующей. Объекты сохраняют свои свойства и методы при передаче.

Get-Process | Where-Object { $_.CPU -gt 10 } | Select-Object Name, CPU | Sort-Object CPU -Descending

Parameter Binding — механизм связывания параметров команд с аргументами. PowerShell автоматически сопоставляет аргументы с параметрами команды по имени или позиции.

Get-ChildItem -Path "C:\Temp" -Filter "*.txt" -Recurse

Variable Expansion — механизм подстановки значений переменных в строки. Двойные кавычки позволяют использовать переменные внутри строк, а фигурные скобки отделяют имя переменной от остального текста.

$name = "World"
$message = "Hello, $name!"
$complex = "Value is ${value}, not $valueextra"

Script Block Invocation — механизм выполнения блоков кода. Оператор & вызывает скрипт-блок или функцию, передавая ей аргументы.

$script = { Write-Output "Выполняется скрипт" }
& $script

Dot Sourcing — механизм загрузки функций и переменных из внешнего файла. Точка перед путем к файлу загружает содержимое файла в текущую область видимости.

. .\functions.ps1

Here Strings — механизм создания многострочных строк. Использует синтаксис @" ... "@ для создания строк с сохранением форматирования и поддержкой переменных.

$text = @"
Это многострочная строка.
Она сохраняет форматирование.
Переменная $name будет подставлена.
"@

Обработка ошибок и исключений

Система обработки ошибок

Error Action Preference — глобальная переменная, определяющая поведение PowerShell при возникновении ошибок. Значения включают Stop (остановить выполнение), Continue (продолжить выполнение), SilentlyContinue (игнорировать ошибку), Inquire (запросить действие пользователя).

$ErrorActionPreference = "Stop"

try {
Get-Content "nonexistent.txt"
} catch {
Write-Output "Ошибка: $_"
}

$Error — встроенный массив, содержащий последние возникшие ошибки. Каждый элемент массива представляет объект исключения с информацией об ошибке.

Get-Content "missing.txt" 2>$null
Write-Output $Error.Count
Write-Output $Error[0].Exception.Message

$ErrorMessage — переменная, содержащая сообщение об ошибке последнего исключения. Доступна в блоке catch для получения детальной информации.

try {
1 / 0
} catch {
Write-Output "Ошибка: $($_.Exception.Message)"
}

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

function Test-Params {
param([string]$Param1, [string]$Param2)

Write-Output $PSBoundParameters.Keys
}

Test-Params -Param1 "Value1"

Продвинутая обработка ошибок

Throw with ErrorRecord — возможность создания пользовательских объектов ошибок с подробной информацией. Позволяет указать код ошибки, категорию и источник проблемы.

$errorRecord = New-Object Система.Management.Автоматизация.ErrorRecord(
"Ошибка подключения",
"ConnectionFailed",
[Система.Management.Автоматизация.ErrorCategory]::ConnectionError,
"Server1"
)

throw $errorRecord

Catch specific exception types — возможность перехватывать определенные типы исключений. Позволяет обрабатывать разные ошибки разными способами.

try {
Get-Item "C:\Temp\file.txt"
} catch [Система.IO.FileNotFoundException] {
Write-Output "Файл не найден"
} catch [Система.UnauthorizedAccessException] {
Write-Output "Нет прав доступа"
} catch {
Write-Output "Другая ошибка: $_"
}

Finally block usage — использование блока finally для очистки ресурсов. Блок выполняется всегда, независимо от того, произошло ли исключение.

$file = $null

try {
$file = New-Object Система.IO.FileStream "test.txt", ([IO.FileMode]::Create)
# Работа с файлом
} catch {
Write-Output "Ошибка: $_"
} finally {
if ($null -ne $file) {
$file.Close()
}
}

Throw inside functions — генерация исключений внутри функций для сигнализации об ошибках. Позволяет передать информацию об ошибке вызывающему коду.

function Divide {
param([int]$numerator, [int]$denominator)

if ($denominator -eq 0) {
throw "Деление на ноль невозможно"
}

return $numerator / $denominator
}

try {
$result = Divide 10 0
} catch {
Write-Output "Ошибка: $_"
}

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

Пример 1: Обработка файлов с условиями

$directory = "C:\Temp"
$extension = ".txt"

if (Test-Path $directory) {
$files = Get-ChildItem -Path $directory -Filter "*$extension"

foreach ($file in $files) {
if ($file.Length -gt 1KB) {
Write-Output "Большой файл: $($file.Name)"
} elseif ($file.CreationTime -lt (Get-Date).AddDays(-30)) {
Write-Output "Старый файл: $($file.Name)"
}
}
} else {
Write-Output "Директория не найдена"
}

Пример 2: Цикл с обработкой ошибок

$servers = @("Server1", "Server2", "Server3")

foreach ($server in $servers) {
try {
$ping = Test-Connection -ComputerName $server -Count 1 -Quiet

if ($ping) {
Write-Output "Сервер $server доступен"
} else {
Write-Output "Сервер $server недоступен"
}
} catch {
Write-Output "Ошибка проверки сервера $server: $_"
}
}

Пример 3: Фильтрация и группировка данных

$processes = Get-Process | Where-Object { $_.CPU -gt 10 }

$grouped = $processes | Group-Object Name

foreach ($group in $grouped) {
Write-Output "Процесс $($group.Name): $($group.Count) экземпляров"
}

Пример 4: Работа с параметрами функции

function Configure-User {
param(
[string]$Username,
[ValidateSet("Admin", "User", "Guest")]
[string]$Role = "User",
[switch]$EnableRemoteAccess
)

Write-Output "Настройка пользователя: $Username"
Write-Output "Роль: $Role"

if ($EnableRemoteAccess.IsPresent) {
Write-Output "Удаленный доступ включен"
}
}

Configure-User -Username "Ivan" -Role "Admin" -EnableRemoteAccess

Пример 5: Обработка потоков данных

1..100 |
Where-Object { $_ % 2 -eq 0 } |
ForEach-Object { $_ * 2 } |
Sort-Object -Descending |
Select-Object -First 5

См. также

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