HOWTO · PowerShell

PowerShell 中的布尔值

本文将解释布尔值是什么,以及我们如何在 Windows PowerShell 环境中使用它们。

本页内容

PowerShell 使用 $true 和 $false 表示布尔值。比较运算和命令都可以生成这些值;你可以用逻辑运算符组合它们,也可以用它们控制 if 语句。

PowerShell 中的布尔值

布尔值表示两种逻辑状态之一:真或假。在 PowerShell 中,原生布尔字面量是 $true 和 $false。PowerShell 会将它们显示为 True 和 False,但显示出来的词并不是带引号的字符串。例如,$true 是布尔值,而 "True" 是字符串。同样,1 和 0 是数字,并非原生布尔值。需要时,脚本可以显式转换值;不过,在条件中直接使用布尔字面量会更清晰。

布尔值很有用,因为比较和命令都可以生成布尔值,而脚本可以根据结果选择后续操作。比较会用到诸如 -eq(等于)和 -ne(不等于)这样的运算符。逻辑运算符可以组合或取反布尔表达式。下面的示例展示 PowerShell 输出这些值时的形式。

比较值并组合条件

比较运算符会生成布尔结果。以下运算符用于比较值:-eq 用于判断是否相等,-ne 用于判断是否不相等,-gt 表示大于,-lt 表示小于,-ge 表示大于或等于,-le 表示小于或等于。PowerShell 的比较运算符也可以比较字符串;默认情况下,字符串比较不区分大小写。需要进行区分大小写的相等比较时,请使用 -ceq。

运行以下示例:

本节中的代码以及显示的标签或输出仍为英文。

$score = 84
$name = "Ava"
$hasName = $name -ne ""
$passed = ($score -ge 70) -and $hasName
$needsReview = -not $passed

Write-Output (10 -eq 10)
Write-Output (10 -ne 8)
Write-Output (10 -gt 8)
Write-Output (10 -lt 8)
Write-Output (10 -le 10)
Write-Output (10 -ge 10)
Write-Output ($true -and $false)
Write-Output ($true -or $false)
Write-Output $needsReview
if ($passed) {
    Write-Output "Ava passed."
} else {
    Write-Output "Ava did not pass."
}
True
True
True
False
True
True
False
True
False
Ava passed.

前六行演示了比较运算符及其布尔结果。逻辑运算符 -and 仅在两个操作数都为真时才为真;-or 则在至少一个操作数为真时为真。-not 会反转布尔值,因此 $passed 为真时,$needsReview 为假。括号可以清楚地标明哪些比较共同构成组合条件。在此示例中,$passed 保存一个布尔表达式,而 if 语句使用该值来选择一个分支。

从 PowerShell 命令获取布尔结果

有些命令会直接返回布尔值。Test-Path 在指定路径存在时返回 $true,否则返回 $false。结果取决于当前计算机和所检查的路径;不要假设某个 Windows 目录在所有系统上都存在。例如,可以将 Test-Path -Path $env:TEMP 赋给变量,以检查当前环境定义的临时目录。

将 Test-Connection 与 -Quiet 一起使用时,也可以返回布尔结果。例如,$reachable = Test-Connection -ComputerName "example.com" -Count 2 -Quiet 会保存目标是否响应了连接尝试。网络访问、DNS、防火墙规则、远程配置以及 PowerShell 版本,都可能影响结果或命令行为,因此一台计算机上的结果不能保证在所有环境中都相同。如果版本差异可能影响行为,请在运行脚本的系统上查看该命令的帮助信息。

命令也可能输出文本或对象,而不是单个布尔值。在条件中使用命令输出时,应留意命令会产生一个结果还是多个结果;集合的真值判断方式和管道行为都可能影响条件结果。如果任务明确需要布尔响应,优先使用 -Quiet 这样的命令选项。

在脚本中使用布尔值

如果某个条件会重复使用,可以将比较或命令的结果存入名称明确的变量。例如,$isAvailable = Test-Path -Path $env:TEMP 会保存检查结果,而 if ($isAvailable) { ... } 可以据此选择响应。如果某项操作需要满足所有前提条件,组合检查就很有用:$isReady -and $hasPermission。当任一条件满足即可时,使用 -or;当条件为假时脚本才应采取操作,则使用 -not。

PowerShell 将布尔值与数值视为不同类型。不要把 1 说成 $true,也不要把 0 说成 $false;特定 API、文件格式或外部系统可能会用数字或文本表示真/假字段,但这种表示方式属于该接口。应在数据边界处转换或验证数据,而不要依赖隐式假设。明确这一区别有助于避免意外的比较结果,也能让脚本意图更容易理解。

结论

PowerShell 的 $true 和 $false 表示布尔状态。-eq、-ne、-gt、-lt、-le 和 -ge 等比较运算符会生成布尔结果;-and、-or 和 -not 则可以组合或反转这些结果。Test-Path 和 Test-Connection -Quiet 等命令也可以提供布尔结果,其含义取决于所检查的路径或环境。将这些结果赋给含义清晰的变量,并在条件中使用它们来控制脚本流程。与外部系统交换数据时,尤其要区分布尔值、字符串和数字。