首页/系统/Windows 运维速查/逻辑运算符与短路求值
PowerShell 基础66 条

逻辑运算符与短路求值

组合条件:-and/-or/-not/-xor;理解短路求值,可把可能出错的表达式放在右侧被“短路保护”。

Windows 运维速查系统更新于 2026-10-13

逻辑运算符是什么

PowerShell 用 -and、-or、-xor、-not 组合多个条件,取代 && 与 || 这类符号(PowerShell 7 也支持 && 与 || 作为语句级链式运算符,语义与符号版一致但作用于整条命令)。它们都做短路求值:左侧已经能决定结果时右侧不执行。这个特性可以拿来保护容易出错的表达式——把可能报错的判断放在右侧,前面用一个便宜的前置条件挡住。

基本信息

适用平台PowerShell 5.1 / 7.x;&& 与 || 需 7.0 以上
常用运算符-and、-or、-xor、-not(! 是 -not 的别名)
短路规则-and 左侧为假即不再求右侧;-or 左侧为真即不再求右侧
优先级-not 高于 -and,-and 高于 -or,混用建议加括号
返回类型布尔值;参与条件判断时会被隐式转换
配套说明about_Logical_Operators、about_Operator_Precedence

典型使用场景

  • 判断服务存在且状态为运行,再决定是否操作
  • 空值保护:先判 $null 再取属性,避免报错中断脚本
  • 多条件筛选:按扩展名或按大小同时过滤文件
  • 状态机判断:多个前提都满足才继续执行
  • 用 -not 反转 Test-Path 之类的存在性判断

常用示例

常用示例
if ($svc -and $svc.Status -eq 'Running') { '服务正常' }        # 空值保护 + 状态判断
$obj -ne $null -and $obj.Name -eq 'x'                            # 先判空再取属性
-not (Test-Path D:\a)                                           # 不存在时执行后续
if ($f.Extension -eq '.log' -or $f.Extension -eq '.txt') { $f }   # 或条件筛选
Get-Service | Where-Object { $_.Status -eq 'Running' -and $_.StartType -eq 'Automatic' }
$ok = (Test-Path D:\a) -and (Test-Path D:\b) -and (Test-Path D:\c)   # 组合多个前置检查
pwsh -c 'Test-Path D:\a && Get-ChildItem D:\a'                 # PowerShell 7 的语句级链式

运算符速查

运算符语义典型用途
-and两边都为真才真多条件同时满足
-or任一边为真即真按类别分流筛选
-xor恰好一边为真互斥状态校验
-not / !取反存在性判断反转
&& / ||语句级短路执行右语句仅 PowerShell 7 可用
短路求值是可利用的保护机制:把廉价且一定安全的判断放左侧,把可能抛异常的表达式放右侧,脚本就不会因为一个空对象而整体中断。
PowerShell 5.1 不支持 && 与 ||,脚本里写它们会直接语法报错;要跨版本复用就用 -and / -or,或脚本内检查 $PSVersionTable 后分支处理。
条件表达式里别依赖隐式转换的细节:空数组、空字符串、数字 0 在布尔上下文中的取值各有讲究,判断“有没有值”时用 $null、-eq '' 或 .Count 显式写清楚,比让引擎替你猜更稳妥。

易错点

  • 在空值对象上直接取属性会报错并使脚本中断,务必先用 $null 判断做左侧保护
  • 把 && 写进需要兼容 PowerShell 5.1 的脚本,运行即语法错误
  • 混用 -and 与 -or 不加括号,依赖默认优先级得出的结果与预期不符
  • 把布尔结果直接当作值参与字符串拼接,得到 True 而不是期望的文本

数据来源与参考

  • Microsoft Learn:about_Logical_Operators

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌