Управляющие структуры PowerShell

Управляющие конструкции — это «мозг» программы: они определяют, при каких условиях выполняется код, повторяется ли он и как корректно обрабатывать ошибки.

Как современный язык сценариев, PowerShell предоставляет полный синтаксис управления потоком выполнения, включая:

  • Условные операторы:if、elseif、else、switch
  • Структуры циклов:for、foreach、while、do-while
  • Механизмы обработки ошибок:try-catch-finally

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

if / elseif / else

Базовый синтаксис:

if (条件1) {
    # 条件1为真执行
} elseif (条件2) {
    # 条件2为真执行
} else {
    # 其他情况
}

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

$disk = Get-PSDrive C
if ($disk.Free -lt 5GB) {
    Write-Output "磁盘空间不足!"
} elseif ($disk.Free -lt 10GB) {
    Write-Output "磁盘空间偏低。"
} else {
    Write-Output "磁盘空间充足。"
}

switch

Когда есть несколько возможных значений для проверки,switchболее читабельно, чем несколькоifоператоров [if].

switch ($value) {
    "start" { Write-Output "开始任务" }
    "stop"  { Write-Output "停止任务" }
    "exit"  { Write-Output "退出程序" }
    default { Write-Output "未知命令" }
}

Поддерживает сопоставление шаблонов:

switch -Wildcard ($filename) {
    "*.txt" { "文本文件" }
    "*.jpg" { "图片文件" }
    default { "其他类型" }
}

2. Структуры циклов

forЦикл for (классический цикл со счётчиком)

for ($i = 1; $i -le 5; $i++) {
    Write-Output "第 $i 次"
}

foreachЦикл foreach (перебор коллекций)

$names = "张三", "李四", "王五"
foreach ($name in $names) {
    Write-Output "你好,$name"
}

Вы также можете использоватьForEach-Objectверсия с конвейером:

$names | ForEach-Object { Write-Output "你好,$_" }

whileЦикл while (выполняется, пока условие истинно)

$count = 0
while ($count -lt 3) {
    Write-Output "计数:$count"
    $count++
}

do-whileиdo-until

doЦикл do-whileвыполнится как минимум один раз:

$count = 0
do {
    Write-Output "当前值:$count"
    $count++
} while ($count -lt 3)

do-until: он останавливается только тогда, когда условие становится истинным

$count = 0
do {
    Write-Output "当前值:$count"
    $count++
} until ($count -ge 3)

3. Обработка ошибок: try / catch / finally

PowerShell предоставляет структурированный механизм обработки исключений для перехвата и реагирования на ошибки времени выполнения.

3.1 Базовая структура

try {
    # 尝试运行可能出错的代码
}
catch {
    # 错误时执行
}
finally {
    # 无论是否出错,都会执行(可选)
}

Пример: обработка ошибок деления на ноль

try {
    $result = 10 / 0
}
catch {
    Write-Output "发生错误:$($_.Exception.Message)"
}
finally {
    Write-Output "运算结束"
}

Перехват конкретных типов исключений

try {
    Get-Content "不存在的文件.txt"
}
catch [System.IO.FileNotFoundException] {
    Write-Output "文件未找到!"
}
catch {
    Write-Output "其他错误:$($_.Exception.Message)"
}
Принудительная генерация исключений командами

По умолчанию некоторые команды только выводят ошибки и не входят вcatchблок. В этом случае нужно добавить параметр:

Remove-Item "不存在的文件.txt" -ErrorAction Stop

или задать глобальную политику:

$ErrorActionPreference = "Stop"

4. Итоги

Управляющая конструкция Функция Применимый сценарий
if / else Вычисление одного или нескольких условий Проверка диска, состояния и т. д.
switch Многоветвевое вычисление (значение или шаблон) Разбор команд, классификация
for Конечное количество итераций Когда количество итераций известно
foreach Обход массивов или коллекций Списки пользователей, списки файлов и т. д.
while Выполнять, пока условие истинно Ожидание определённого состояния или изменения
do-while Выполнить хотя бы один раз Первоначальная проверка + механизм повторных попыток
try-catch Перехват ошибок времени выполнения для предотвращения прерывания работы скрипта Файловые операции, сетевые запросы и т. д.
finally Очистка ресурсов, вывод логов и другие завершающие операции Обеспечить, чтобы определённый блок кода всегда выполнялся

5. Практические задания

Задача 1: Определить, является ли число чётным или нечётным

$number = 7
if ($number % 2 -eq 0) {
    "偶数"
} else {
    "奇数"
}

Задача 2: Пройти по массиву и вывести длину каждого элемента

$items = "apple", "banana", "cherry"
foreach ($item in $items) {
    "$item 的长度是 $($item.Length)"
}

Задача 3: Обработать ошибки чтения файла

try {
    Get-Content "D:\not-exist.txt"
}
catch {
    "文件读取失败:" + $_.Exception.Message
}
Другие расширения