PowerShell 制御構造

制御構造はプログラムの「頭脳」であり、コードがどのような条件下で実行されるか、繰り返し実行されるか、そしてエラーをどのように優雅に処理するかを決定します。

PowerShell は現代のスクリプト言語として、完全なフロー制御構文を提供しています。以下が含まれます:

  • 条件文:if、elseif、else、switch
  • ループ構造:for、foreach、while、do-while
  • エラー処理メカニズム:try-catch-finally

一、条件文

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 { "其他类型" }
}

二、ループ構造

forfor ループ(古典的なカウントループ)

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

foreachforeach ループ(コレクションの走査)

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

パイプライン版も使用できます:ForEach-Objectパイプライン版:

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

whilewhile ループ(条件が真の場合に実行)

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

do-whileとdo-until

dodo...while ループは少なくとも1回実行されます:

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

do-until:条件が真になるまで停止しません

$count = 0
do {
    Write-Output "当前值:$count"
    $count++
} until ($count -ge 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 ブロックには入りません。catchこの場合はパラメータを追加する必要があります:

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

またはグローバルポリシーを設定します:

$ErrorActionPreference = "Stop"

四、まとめ

制御構造 機能 適用シーン
if / else 1つ以上の条件を判断する ディスクや状態などを判断する
switch 多分岐の判断(値またはパターンマッチング) コマンド解析、分類
for 有限回数の反復 明確なループ回数
foreach 配列またはコレクションを走査する ユーザーリスト、ファイルリストなど
while 条件が真の場合に実行する 特定の状態や変化を待つ
do-while 少なくとも1回実行する 初回検証 + リトライメカニズム
try-catch 実行時エラーをキャッチし、スクリプトの中断を防ぐ ファイル操作、ネットワークリクエストなど
finally リソースのクリーンアップ、ログ出力などの終了処理 特定のコードブロックが常に実行されることを保証する

五、練習タスク

タスク 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
}
その他の拡張