逻辑运算符是什么
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 显式写清楚,比让引擎替你猜更稳妥。