【发布时间】:2018-09-03 15:17:50
【问题描述】:
我在 if 语句中尝试了 $psCustomObject.x -eq $null 和 $null -eq $psCustomObject.x 这两种情况,只有后者通过了 if。
为什么会这样?这似乎不合逻辑。
我的具体用例是一个包含多个环境配置的 json 文件。环境的名称是对象中的关键,我的目标是在针对不存在的环境(可能是错字)时通知用户然后停止。
我不想使用! opreator 因为它具有极高的信息与代码比率 - 它很容易被忽视但有很大的不同,因此我一般不喜欢它。它还需要了解语言的工作原理(powershell 不是静态类型的,我不希望读者需要知道什么是真实的或不真实的)。这听起来可能很愚蠢,但 powershell 不是我的主要语言,我的同事也不是。可读性对我来说是关键因素。
【问题讨论】:
-
你能分享一下
$psCustomObject是什么吗?即它的类型是什么,它的价值是什么? -
为什么不干脆做
if (!($psCustomObject.x)) -
-eq不是对称运算符,因此$a -eq $b与$b -eq $a不同。例如:$a = 1, 2, 3, 2, 1; $b = 2; $a -eq $b <# 2, 2 #>; $b -eq $a <# False #> -
我怀疑这与 PowerShell 的类型转换规则有某种联系——也就是说,PS 总是会尝试将右操作数强制转换为左操作数的类型,如果它们开始不同,你可能会得到奇怪的结果 - 例如
" 02 " -eq 2会出现$false,但2 -eq " 02 "会返回$true。 -
由于 PowerShell 中使用的类型推断方法,当比较在左侧时,$null 或空字段将被转换为 false。当涉及数组时尤其如此。因此,经验法则:始终在左侧使用 $null 进行比较。
标签: powershell syntax operators