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)"
}
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