PowerShell 条件语句:if、switch
编写自动化脚本时,最核心的需求是让计算机具备“判断能力”。通过条件语句,脚本可以根据不同的情况(如服务是否停止、磁盘空间是否充足)执行不同的操作。PowerShell 提供了 if 和 switch 两种主要的条件判断结构,掌握它们是编写智能化脚本的基础。
一、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 参数,* 被视为通配符,可以匹配任意长度的字符。
三、常用比较运算符速查
在 if 和 switch 的条件中,必须使用 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`。
暂无评论,快来抢沙发吧!