powershell逻辑运算符和$Error变量
最近,我不得不检查脚本执行时是否出现了一些错误。首先,我尝试检查$Error是否为$null。对我来说奇怪的是,我没有从中得到任何结果(既不是真的,也不是假的)。然后我写了:powershell逻辑运算符和$Error变量,powershell,Powershell,最近,我不得不检查脚本执行时是否出现了一些错误。首先,我尝试检查$Error是否为$null。对我来说奇怪的是,我没有从中得到任何结果(既不是真的,也不是假的)。然后我写了: if (($error -eq $null) -or ($error -ne $null)) {Write-Host "NULL"} 输出中什么也没有。这让我很困惑。我发现所有System.Collections.ArrayList类型的变量都会发生这种情况 也许有人知道为什么会发生这种情况,因为对我来说这看起来像一个b
if (($error -eq $null) -or ($error -ne $null)) {Write-Host "NULL"}
输出中什么也没有。这让我很困惑。我发现所有System.Collections.ArrayList类型的变量都会发生这种情况
也许有人知道为什么会发生这种情况,因为对我来说这看起来像一个bug
我在Powershell的版本中发现了这一点,它是3.0。当对数组(或arraylist)使用-eq运算符时,它将返回满足条件的数组的所有成员 ($error-eq$null)表示“我希望$error数组列表中的所有成员都为null。”它只能返回$null 当您在IF中使用它时,结果将被转换为[bool]$当强制转换为[bool]时,Null的计算结果为$false ($error-eq$null)永远不能为真
$x = new-object collections.arraylist
[void]$x.Add('a')
[void]$x.add('b')
($x -eq $null).count
[bool]($x -eq $null)
[void]$x.Add($Null)
($x -eq $null).count
[bool]($x -eq $null)
0
False
1
False
@mjolinor的回答试图解释它,但不完整
当您执行(1,2,3)-eq 1
时,返回1
。在这种情况下,-eq
对数组的作用是返回与RHS相等的元素,如果不匹配,则不返回任何内容
另一方面,如果执行1-eq(1,2,3)
,则会得到False
,因为只有当数组是LHS时才会出现上述情况。因此,当涉及到数组时,-eq
操作符的行为与上述情况不同,这是不正确的
现在,进入-ne
用法。当您执行(1,2,3)-ne 1
时,您将获得数组2,3
。也就是说,它返回不等于RHS的元素。与-eq
类似,1-ne(1,2,3)
将返回True
出现您的状况-($error-eq$null)-或($error-ne$null)
当$error
为空时,$error-eq$null
将不返回任何内容(因此在bool语句中为False
)。这当然是因为$error中没有匹配$null
的元素。另外,$error-ne$null
也将不返回任何内容(因此在bool语句中是False
),因为$error是空的,并且其中没有非$null的元素
因此,当$error
为空时,您的语句将为false,if中的块将不会执行
如果$error
不是空的,则这两个条件中的任何一个都是真的,并且您会看到执行了写主机
那么您真正如何解决这个问题呢?
最简单的方法是检查$error
数组的长度:
if($error.length -gt 0){
write-host "error occured"
}
另外,请阅读这篇讨论各种错误处理策略的文章-该答案的“错误”到底是什么?@mjolinor-因此,-eq运算符在数组中的行为并不总是与上述情况相同。
@mjolinor-答案的正确性是什么?抱歉,它甚至没有提到OP在问题中使用的-ne
,我说了。我可以同意,这是“不完整的”没有解决的-ne。我看不出当前问题的“错”在哪里,或者为什么你的问题是“对”的。我同意如果你把数组列表放在右边,它会产生你描述的结果,但他没有这样做。arrlist($error)在两个表达式中都位于左侧。如果执行此操作,$error.clear()
(这在生成错误之前是有意义的,然后$error.length
是未定义的,即返回一个错误此对象上找不到属性“length”。请验证该属性是否存在。
以便答案不可接受。有趣的((1,$null,2)-eq$null)[0]-eq$null
-eq
输出和数组