about_If
简短说明
介绍一种语言命令,该语句可基于条件测试结果运行语句列表。
长说明
如果指定的条件测试的计算结果为 true,则可以使用 if
语句运行代码块。 如果以前的所有测试的计算结果都为 false,还可以指定要运行的一个或多个其他条件测试。 最后,可以指定一个额外的代码块,如果之前没有其他条件测试的计算结果为 true,则该代码块将运行。
语法
以下示例演示 if
语句语法:
if (<test1>)
{<statement list 1>}
[elseif (<test2>)
{<statement list 2>}]
[else
{<statement list 3>}]
运行 if
语句时,PowerShell 会将 <test1>
条件表达式计算为 true 或 false。 如果 <test1>
为 true,则 <statement list 1>
运行,并且 PowerShell 将退出 if
语句。 如果 <test1>
为 false,PowerShell 将评估由 <test2>
条件语句指定的条件。
有关布尔评估的详细信息,请参阅 about_Booleans。
如果 <test2>
为 true,则 <statement list 2>
运行,并且 PowerShell 将退出 if
语句。 如果 <test1>
和 <test2>
的计算结果为 false,则 <statement list 3
> 代码块将运行,并且 PowerShell 将退出 if
语句。
可以使用多个 elseif
语句链接一系列条件测试。 仅当以前的所有测试均为 false 时,才会运行每个测试。 如果需要创建包含许多 elseif
语句的 if
语句,请考虑改用 Switch 语句。
示例:
最简单的 if
语句包含单个命令,不包含任何 elseif
语句或任何 else
语句。 以下示例显示了 if
语句的最简单形式:
if ($a -gt 2) {
Write-Host "The value $a is greater than 2."
}
在此示例中,如果 $a
变量大于 2
,则条件的计算结果为 true,并且语句列表运行。 但是,如果 $a
小于或等于 2
或者不是现有变量,则 if
语句不会显示消息。
通过添加 Else 语句,当 $a 小于或等于 2 时,将显示一条消息。 如下一示例所示:
if ($a -gt 2) {
Write-Host "The value $a is greater than 2."
}
else {
Write-Host ("The value $a is less than or equal to 2," +
" is not created or is not initialized.")
}
若要进一步优化此示例,可以使用 elseif
语句在 $a
的值等于 2
时显示消息。 如下一示例所示:
if ($a -gt 2) {
Write-Host "The value $a is greater than 2."
}
elseif ($a -eq 2) {
Write-Host "The value $a is equal to 2."
}
else {
Write-Host ("The value $a is less than 2 or" +
" was not created or initialized.")
}
使用三元运算符语法
PowerShell 7.0 引入了一种使用三元运算符的新语法。 它遵循 C# 三元运算符语法:
<condition> ? <if-true> : <if-false>
三元运算符的行为类似于简化的 if-else
语句。 计算 <condition>
表达式,并将结果转换为布尔值,以确定接下来应计算哪个分支:
- 如果
<condition>
表达式为 true,则执行<if-true>
表达式 - 如果
<condition>
表达式为 false,则执行<if-false>
表达式
例如:
$message = (Test-Path $path) ? "Path exists" : "Path not found"
在此示例中,当 Test-Path
返回 $true
时,$message
的值为 Path exists
。 当 Test-Path
返回 $false
时,$message
的值为 Path not found
。
$service = Get-Service BITS
$service.Status -eq 'Running' ? (Stop-Service $service) : (Start-Service $service)
在此示例中,如果服务正在运行,则它会停止,如果其状态不为 Running,则会启动。
如果 <condition>
、<if-true>
或 <if-false>
表达式调用命令,则必须将其包装在括号中。 否则,PowerShell 将为 <condition>
表达式中的命令引发参数异常,并分析 <if-true>
和 <if-false>
表达式的异常。
例如,PowerShell 为这些三元引发异常:
Test-Path .vscode ? Write-Host 'exists' : Write-Host 'not found'
(Test-Path .vscode) ? Write-Host 'exists' : Write-Host 'not found'
(Test-Path .vscode) ? (Write-Host 'exists') : Write-Host 'not found'
Test-Path: A positional parameter cannot be found that accepts argument '?'.
ParserError:
Line |
1 | (Test-Path .vscode) ? Write-Host 'exists' : Write-Host 'not found'
| ~
| You must provide a value expression following the '?' operator.
ParserError:
Line |
1 | (Test-Path .vscode) ? (Write-Host 'exists') : Write-Host 'not found'
| ~
| You must provide a value expression following the ':' operator.
此示例分析:
(Test-Path .vscode) ? (Write-Host 'exists') : (Write-Host 'not found')
exists