Управляющие структуры 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
}
Другие расширения