Estructuras de control de PowerShell

Las estructuras de control son el "cerebro" de un programa: determinan bajo qué condiciones se ejecuta el código, si se repite, y cómo manejar errores con elegancia.

Como lenguaje de scripting moderno, PowerShell proporciona una sintaxis completa de control de flujo, que incluye:

  • Declaraciones condicionales:if、elseif、else、switch
  • Estructuras de bucle:for、foreach、while、do-while
  • Mecanismo de manejo de errores:try-catch-finally

1. Declaraciones condicionales

if / elseif / else

Sintaxis básica:

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

Ejemplo: determinar si el espacio en disco es insuficiente

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

switch

Cuando hay múltiples valores posibles a evaluar,switchen lugar de múltiplesifes más claro.

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

Admite coincidencia de patrones:

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

2. Estructuras de bucle

forBucle (conteo clásico)

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

foreachBucle (recorrido de colecciones)

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

También se puede usarForEach-ObjectVersión con tubería:

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

whileBucle (ejecutar mientras sea verdadero)

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

do-whileydo-until

doEl buclese ejecuta al menos una vez:

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

do-until: no se detiene hasta que la condición sea verdadera

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

3. Manejo de errores: try / catch / finally

PowerShell proporciona un mecanismo estructurado de manejo de excepciones para capturar y responder a errores en tiempo de ejecución.

3.1 Estructura básica

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

Ejemplo: manejar error de división por cero

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

Capturar tipos de excepción específicos

try {
    Get-Content "不存在的文件.txt"
}
catch [System.IO.FileNotFoundException] {
    Write-Output "文件未找到!"
}
catch {
    Write-Output "其他错误:$($_.Exception.Message)"
}
Forzar a los comandos a lanzar excepciones

De forma predeterminada, algunos comandos solo imprimen errores y no entran encatch. En este caso, es necesario agregar el parámetro:

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

o establecer una política global:

$ErrorActionPreference = "Stop"

4. Resumen

Estructura de control Función Escenario de aplicación
if / else Evaluar una o más condiciones Evaluar disco, estado, etc.
switch Evaluación de múltiples ramas (coincidencia de valores o patrones) Análisis de comandos, clasificación
for Iteración de número finito de veces Número de iteraciones definido
foreach Recorrer matrices o colecciones Listas de usuarios, listas de archivos, etc.
while Ejecutar mientras la condición sea verdadera Esperar cierto estado o cambio
do-while Se ejecuta al menos una vez Verificación inicial + mecanismo de reintento
try-catch Capturar errores de ejecución para evitar que el script se interrumpa Operaciones de archivos, solicitudes de red, etc.
finally Operaciones finales como limpiar recursos, imprimir registros, etc. Garantizar que cierto bloque de código se ejecute siempre

5. Tareas de práctica

Tarea 1: Determinar si un número es par o impar

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

Tarea 2: Recorrer una matriz e imprimir la longitud de cada elemento

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

Tarea 3: Manejar errores de lectura de archivos

try {
    Get-Content "D:\not-exist.txt"
}
catch {
    "文件读取失败:" + $_.Exception.Message
}
Otras extensiones