首页/系统/Windows 运维速查/空值判断与安全比较
PowerShell 基础66 条

空值判断与安全比较

PowerShell 空值语义细节多:$null 比较要放左侧、空数组与空字符串不同、集合判空与属性缺失的区分。

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

空值判断是什么

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 $nullFalse空字符串不等于空值
$null.Count0空值取 Count 不报错
[string]::IsNullOrEmpty('')True空串判空最快写法
$null -eq $x.Length可能为真需先确认属性存在
数组参与比较时会做元素过滤:@(1,$null,2) -eq $null 返回的是元素本身而不是 True。这就是为什么规范要求把 $null 写在左侧——放在左侧时比较走的是标量语义。
判断“有没有值”别只靠隐式布尔转换:数字 0、空数组、空字符串在布尔上下文里都是假,但业务含义完全不同,显式写出你关心的是什么。

易错点

  • 把 $null 写在右侧,集合比较返回元素列表被当成 True 使用,逻辑悄悄跑偏
  • 混淆空字符串与 $null,配置判断时把“未设置”和“设置为空”当成同一回事
  • 直接在可能为空的变量上取属性,一次异常让整段脚本终止
  • 用 .Length 判断数组是否为空,对 $null 取值会得到 0 而误判为“空但不报错”,掩盖了上游取值失败

数据来源与参考

  • Microsoft Learn:about_Comparison_Operators
  • Microsoft Learn:about_Arrays

相关工具

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