PS7 三元与空合并是什么
PowerShell 7 引入了三元运算符 ?:、空合并运算符 ?? 和空合并赋值 ??=,把「条件赋值」和「取默认值」这两类常见逻辑从 if/else 块压缩成一行表达式。Windows 自带的 PowerShell 5.1 并不支持这些语法,直接运行会抛解析错误,所以写跨版本脚本前必须先确认目标机器的版本。
基本信息
| 适用平台 | PowerShell 7.0 及以上(Windows/Linux/macOS) |
|---|---|
| 三元运算符 | <条件> ? <真值> : <假值> |
| 空合并 | <值> ?? <默认值> |
| 空合并赋值 | 变量 ??= 默认值 |
| 兼容性 | 5.1 遇到这些语法直接报错 |
典型使用场景
- 按阈值把数值映射成等级字符串,例如把评分转成高/中/低
- 给可能为空的配置项补默认端口或默认路径
- 链式兜底取值,避免写一长串 $null 判断
- 在脚本参数里给出简洁的默认值逻辑,未传参就用默认值
- 把遗留脚本里的 if/else 赋值改写成表达式,减少缩进层级
- 用 ??= 做惰性初始化,只在变量为空时才去查询或计算一次
常用示例
常用示例
$level = $v -gt 90 ? 'HIGH' : 'NORMAL' # 条件为真取前者
$port = $cfg.Port ?? 8080 # 为 $null 时用默认值
$name ??= '未命名' # 为 $null 时才赋值
$user = $env:USERNAME ?? $env:USER # 可链式兜底
# 旧版本等价写法,5.1 也能跑:
$level = if ($v -gt 90) { 'HIGH' } else { 'NORMAL' }
# 先确认版本再决定用哪种写法:
$PSVersionTable.PSVersion运算符对照
| 运算符 | 行为 | 起始版本 |
|---|---|---|
| ? : | 条件为真取左值,否则取右值 | PowerShell 7.0 |
| ?? | 左侧为 $null 时取右侧 | PowerShell 7.0 |
| ??= | 仅当左侧为 $null 时赋值 | PowerShell 7.0 |
| if/else 表达式 | 等价逻辑,5.1 可用 | PowerShell 2.0 起 |
三元运算符嵌套超过两层可读性明显下降,复杂分支仍然建议用 if/elseif 或 switch;运算符两侧的空格不是语法要求,但保留空格更易读,评审时也不容易看错分支。
?? 只把 $null 视为缺省,空字符串、0、$false 都会被当作有效值原样返回;业务上若要把空字符串也算缺省,必须显式写判断而不能靠 ??。列表、哈希表这类空集合同样不会被替换掉。