文章目录

PowerShell 条件语句:if、switch

发布于 2026-04-13 18:16:15 · 浏览 21 次 · 评论 0 条

PowerShell 条件语句:if、switch

编写自动化脚本时,最核心的需求是让计算机具备“判断能力”。通过条件语句,脚本可以根据不同的情况(如服务是否停止、磁盘空间是否充足)执行不同的操作。PowerShell 提供了 ifswitch 两种主要的条件判断结构,掌握它们是编写智能化脚本的基础。


一、If 语句基础

if 语句是最常用的条件判断结构,用于基于一个或多个条件的真伪来决定执行哪段代码。

1. 基本 If 语法

if 结构的核心包含一个测试条件。如果条件结果为真,则执行代码块中的命令。

打开 PowerShell 终端,输入以下代码并运行,观察 `$num` 的值如何决定输出结果: ```powershell $num = 10

if ($num -gt 5) { Write-Host "数字大于 5" } ``` 在这个例子中,`-gt` 是 PowerShell 的比较运算符,意为“大于”。 ### 2. 添加 Else 和 ElseIf 单一的条件往往不够用。当需要处理“如果不满足条件,则做另一件事”时,**使用** `else` 代码块。当需要检查多个互斥条件时,**使用** `elseif`。 **运行**以下代码,理解多分支逻辑: ```powershell $score = 85

if ($score -ge 90) { Write-Host "评级:优秀" } elseif ($score -ge 60) {
Write-Host "评级:及格"
}
else {
Write-Host "评级:不及格"
}


**注意**:PowerShell 会从上到下依次检查条件,一旦某个条件满足,就会执行对应的代码块并**跳过**后续的所有检查。

### 3. 逻辑运算符

在一个 `if` 语句中,可以**组合**多个条件。PowerShell 使用 `-and`(与)、`-or`(或)以及 `-not`(非)来连接逻辑。

**输入**以下代码进行逻辑测试:

```powershell
$age = 25
$hasID = $true

if ($age -ge 18 -and $hasID) {
    Write-Host "允许入场"
}
else {
    Write-Host "拒绝入场"
}
```

此逻辑表示:只有当年龄大于等于 18 **且** 拥有 ID 时,才输出“允许入场”。

### 4. If 语句执行流程

理解代码的执行走向有助于编写更严谨的逻辑。

```mermaid
flowchart TD
    A[开始] --> B{第一个条件成立?}
    B -- Yes --> C[执行 If 代码块]
    B -- No --> D{第二个条件成立?}
    D -- Yes --> E[执行 ElseIf 代码块]
    D -- No --> F[执行 Else 代码块]
    C --> G[结束]
    E --> G
    F --> G
```

---

## 二、Switch 语句高效多路匹配

当需要根据同一个变量的值进行多次匹配(例如:判断今天是星期几,或者处理不同的错误代码)时,层层堆叠的 `if-elseif` 会显得臃肿且难以阅读。此时,**使用** `switch` 语句是最佳选择。

### 1. 基本 Switch 语法

`switch` 语句会将变量与多个值进行比对,匹配到哪个值,就执行对应的脚本块。

**运行**以下示例,体验 `switch` 的便捷性:

```powershell
$fileType = "log"

switch ($fileType) {
    "txt"  { Write-Host "这是一个文本文件" }
    "log"  { Write-Host "这是一个日志文件" }
    "json" { Write-Host "这是一个配置文件" }
    default { Write-Host "未知文件类型" }
}
```

这段代码会依次检查 `$fileType` 是否等于 `"txt"`、`"log"` 或 `"json"`。如果都不匹配,则**执行** `default` 代码块。

### 2. 同时匹配多个值

在一个条件中,**检查**多个可能的值时,可以用逗号分隔。

**输入**以下代码:

```powershell
$status = "Stopped"

switch ($status) {
    {"Running", "Starting" -contains $_} { Write-Host "服务运行中" }
    {"Stopped", "Stopping" -contains $_} { Write-Host "服务已停止" }
    default { Write-Host "状态未知" }
}

这里使用了 -contains 来判断当前变量 $_`(代表正在被检查的 `$status)是否存在于列表中。

3. 高级匹配模式

switch 不仅支持精确的文本匹配,还支持通配符、正则表达式甚至文件内容匹配。只需在 switch 后面添加相应的参数即可。

执行以下代码,体验通配符匹配:

$fileName = "report_2023.docx"

switch -Wildcard ($fileName) {
    "*.txt"  { Write-Host "匹配到文本文件" }
    "*.docx" { Write-Host "匹配到 Word 文档" }
    "*_2023*" { Write-Host "匹配到 2023 年的文件" }
    default { Write-Host "未匹配" }
}

通过 -Wildcard 参数,* 被视为通配符,可以匹配任意长度的字符。


三、常用比较运算符速查

ifswitch 的条件中,必须使用 PowerShell 专用的比较运算符,而不能使用编程语言中常见的 ==>

运算符 描述 示例 示例解释
-eq 等于 $a -eq $b 如果 $a 等于 $b 为真
-ne 不等于 $a -ne $b 如果 $a 不等于 $b 为真
-gt 大于 $a -gt $b 如果 $a 大于 $b 为真
-ge 大于或等于 $a -ge $b 如果 $a 大于等于 $b 为真
-lt 小于 $a -lt $b 如果 $a 小于 $b 为真
-le 小于或等于 $a -le $b 如果 $a 小于等于 $b 为真
-like 通配符匹配 "file" -like "f*" 支持通配符的匹配
-match 正则匹配 `"abc" -match "^\w+$"` | 使用正则表达式匹配 | **注意**:这些运算符默认是不区分大小写的。如果需要严格区分大小写,请在运算符前**加上**字母 `c`,例如 `-ceq`、`-clike`。 --- ## 四、实战演练 ### 场景 1:自动检查服务状态并重启 编写一个脚本,检查特定的 Windows 服务是否正在运行。如果停止了,尝试**启动**它。 **新建**一个名为 `CheckService.ps1` 的文件,**粘贴**以下代码: ```powershell $serviceName = "wuauserv" # Windows Update 服务

获取服务对象

$service = Get-Service -Name $serviceName -ErrorAction SilentlyContinue

检查服务是否存在

if (-not $service) { Write-Error "未找到服务: $serviceName"
exit
}

检查服务状态

if ($service.Status -ne 'Running') { Write-Host "服务 $serviceName 当前状态为 $($service.Status),正在尝试启动..."

try {
    Start-Service -Name $serviceName -ErrorAction Stop
        Write-Host "服务启动成功。"
    }
    catch {
        Write-Error "启动失败: $_"
}

}
else {
Write-Host "服务 $serviceName 正在运行,无需操作。" } ``` **保存**文件,在 PowerShell 中**运行**: ```powershell .\CheckService.ps1 ``` ### 场景 2:根据用户输入处理菜单 编写一个交互式菜单,利用 `switch` 处理用户的数字选择。 **新建**文件 `MenuHandler.ps1`,**输入**以下代码: ```powershell Write-Host "请选择操作:" Write-Host "1. 显示当前日期" Write-Host "2. 显示当前环境变量" Write-Host "3. 清除屏幕" Write-Host "4. 退出" # 读取用户输入,并将其转换为整数 $selection = Read-Host "请输入选项 (1-4)"

switch ($selection) { "1" { Write-Host "当前时间是: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')"
}
"2" {
Get-ChildItem Env: | Format-Table Name, Value -AutoSize
}
"3" {
Clear-Host
}
"4" {
Write-Host "退出脚本"; exit
}
default {
Write-Warning "无效的输入: $selection"
}
}



**运行**脚本并**输入**不同的数字,测试各分支的响应。

---

通过结合 `if` 的逻辑判断能力和 `switch` 的多路分发能力,可以构建出功能强大、逻辑清晰的 PowerShell 自动化任务。在实际编写脚本时,优先根据代码的可读性选择合适的结构:简单二元判断用 `if`,复杂的多值匹配用 `switch`。

评论 (0)

暂无评论,快来抢沙发吧!

扫一扫,手机查看

扫描上方二维码,在手机上查看本文