空值判断是什么
PowerShell 的空值语义有几个反直觉之处,写脚本绕不开。第一,$null 参与比较时应放在左侧,写成 $null -eq $x,否则当 $x 是数组时得到的结果与直觉相反。第二,$null、空字符串、空数组是三种不同的东西,在布尔上下文中的取值也不同。第三,对象属性不存在与属性值为空是两件事,取值前要先确认属性存在,否则报错中断。
基本信息
| 适用平台 | PowerShell 5.1 / 7.x 通用 |
|---|---|
| 推荐写法 | $null -eq $x($null 放左侧) |
| 字符串判空 | [string]::IsNullOrWhiteSpace($s) |
| 集合判空 | $arr.Count -gt 0 或 @($arr).Count |
| 属性存在性 | $obj.PSObject.Properties.Name -contains 'X' |
| 布尔换算 | 空字符串与空数组为假,非空字符串为真 |
典型使用场景
- 从命令输出取值后先判空再取属性,避免脚本中断
- 判断配置项是未设置还是被设为空字符串
- 集合为空时跳过后续处理,避免对空集做聚合得到误导性结果
- 校验用户输入不为空白字符(含空格与制表符)
- 遍历对象集合前判断集合本身是否可用
常用示例
常用示例
if ($null -eq $v) { '为空' } # 规范写法:$null 放左侧
[string]::IsNullOrWhiteSpace($s) # 空、全空白都判为真
if ($null -ne $x -and $x.Count -gt 0) { '非空' } # 非空且元素数大于 0
@().Count # 空数组的 Count 为 0,不是报错
$obj.PSObject.Properties.Name -contains 'Name' # 判断属性是否真的存在
($null -eq $x).GetType().Name # 确认比较返回的是布尔值
if (-not $s) { '空或未赋值' } # 简写,注意 0 与空串也会为真空相关取值速查
| 表达式 | 结果 | 说明 |
|---|---|---|
| $null -eq $x | 布尔 | 数组场景下也符合预期 |
| $x -eq $null | 非布尔 | 数组时会返回所有等于空的元素 |
| '' -eq $null | False | 空字符串不等于空值 |
| $null.Count | 0 | 空值取 Count 不报错 |
| [string]::IsNullOrEmpty('') | True | 空串判空最快写法 |
| $null -eq $x.Length | 可能为真 | 需先确认属性存在 |
数组参与比较时会做元素过滤:@(1,$null,2) -eq $null 返回的是元素本身而不是 True。这就是为什么规范要求把 $null 写在左侧——放在左侧时比较走的是标量语义。
判断“有没有值”别只靠隐式布尔转换:数字 0、空数组、空字符串在布尔上下文里都是假,但业务含义完全不同,显式写出你关心的是什么。