Powershell中nothing与$null的区别、区分方法及变量创建问题
PowerShell中
$null和nothing的区别 我们常说的nothing本质是PowerShell特有的自动化空值:[System.Management.Automation.Internal.AutomationNull]::Value,代表「没有任何输出结果」。
PowerShell为了兼容做了特殊处理,
AutomationNull在绝大多数普通比较、方法调用场景下和$null表现完全一致,比如你示例中$null -eq $n返回True、调用GetType()都会报空引用错误,都是这个原因。二者只有在枚举类场景(数组构造、数组拼接、管道输入)下才会体现出核心差异:
$null是实实在在的空引用对象,会被当作单独的一个元素参与枚举AutomationNull代表「不存在结果」,参与枚举时相当于没有内容,不会被当作元素计数
问题1:无需构造数组,如何判断变量是nothing还是$null
直接用[AutomationNull]的静态值做相等判断即可,注意必须把静态值放在比较符左侧,待判断变量放在右侧,避免数组枚举带来的判断异常:
# 返回True代表是nothing,返回False代表是$null [System.Management.Automation.Internal.AutomationNull]::Value -eq $待判断变量
对应你的测试代码,判断结果如下:
[System.Management.Automation.Internal.AutomationNull]::Value -eq $n # 输出True [System.Management.Automation.Internal.AutomationNull]::Value -eq $c # 输出False
问题2:不使用自定义Get-Nothing函数,如何创建值为nothing的变量
方法1:直接赋值静态值
最直接的方式就是直接给变量赋值AutomationNull的静态实例:
$n = [System.Management.Automation.Internal.AutomationNull]::Value
方法2:赋值无输出的执行结果
只要给变量赋值一个没有任何输出的执行结果,得到的就是nothing,例如:
# 执行空脚本块,无任何输出 $n = & {} # 或者用过滤不到任何结果的管道 $n = 1,2,3 | Where-Object { $_ -gt 10 }
以上两种方法得到的$n,和你示例中Get-Nothing返回的结果完全一致。
内容的提问来源于stack exchange,提问作者joeking
相关产品推荐
相关产品推荐

