PowerShell-Kontrollstrukturen

Kontrollstrukturen sind das "Gehirn" eines Programms; sie bestimmen, unter welchen Bedingungen Code ausgeführt wird, ob er sich wiederholt und wie Fehler elegant behandelt werden.

Als moderne Skriptsprache bietet PowerShell eine vollständige Syntax zur Ablaufsteuerung, einschließlich:

  • Bedingte Anweisungen:if、elseif、else、switch
  • Schleifenstrukturen:for、foreach、while、do-while
  • Mechanismen zur Fehlerbehandlung:try-catch-finally

1. Bedingte Anweisungen

if / elseif / else

Grundlegende Syntax:

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

Beispiel: Prüfen, ob der Festplattenspeicher unzureichend ist

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

switch

Wenn mehrere mögliche Werte ausgewertet werden müssen,switchist besser lesbar als mehrereif[if]-Anweisungen.

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

Unterstützt Musterabgleich:

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

2. Schleifenstrukturen

forfor-Schleife (klassische Zählschleife)

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

foreachforeach-Schleife (Iterieren über Sammlungen)

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

Du kannst auchForEach-Objectdie Pipeline-Version:

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

whilewhile-Schleife (Ausführen, solange die Bedingung wahr ist)

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

do-whileunddo-until

doDie do-while-Schleife wirdmindestens einmal ausgeführt:

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

do-until: Sie stoppt erst, wenn die Bedingung wahr wird

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

3. Fehlerbehandlung: try / catch / finally

PowerShell bietet einen strukturierten Mechanismus zur Ausnahmebehandlung, um Laufzeitfehler abzufangen und darauf zu reagieren.

3.1 Grundstruktur

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

Beispiel: Umgang mit Division-durch-Null-Fehlern

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

Abfangen bestimmter Ausnahmetypen

try {
    Get-Content "不存在的文件.txt"
}
catch [System.IO.FileNotFoundException] {
    Write-Output "文件未找到!"
}
catch {
    Write-Output "其他错误:$($_.Exception.Message)"
}
Erzwingen, dass Befehle Ausnahmen auslösen

Standardmäßig geben einige Befehle nur Fehler aus und betreten nicht dencatchBlock. In diesem Fall müssen Sie einen Parameter hinzufügen:

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

oder legen eine globale Richtlinie fest:

$ErrorActionPreference = "Stop"

4. Zusammenfassung

Kontrollstruktur Funktion Anwendungsfall
if / else Eine oder mehrere Bedingungen auswerten Datenträger, Status usw. prüfen
switch Mehrfachverzweigte Auswertung (Wert- oder Musterabgleich) Befehlsanalyse, Klassifizierung
for Endliche Iterationsanzahl Wenn die Anzahl der Iterationen bekannt ist
foreach Arrays oder Sammlungen durchlaufen Benutzerlisten, Dateilisten usw.
while Ausführen, solange die Bedingung wahr ist Auf einen bestimmten Zustand oder eine Änderung warten
do-while Mindestens einmal ausführen Anfängliche Validierung + Wiederholungsmechanismus
try-catch Laufzeitfehler abfangen, um eine Unterbrechung des Skripts zu verhindern Dateioperationen, Netzwerkanfragen usw.
finally Ressourcen bereinigen, Logs ausgeben und andere abschließende Operationen Sicherstellen, dass ein bestimmter Codeblock immer ausgeführt wird

5. Übungsaufgaben

Aufgabe 1: Feststellen, ob eine Zahl gerade oder ungerade ist

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

Aufgabe 2: Ein Array durchlaufen und die Länge jedes Elements ausgeben

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

Aufgabe 3: Fehler beim Lesen von Dateien behandeln

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