@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) -or ($error -ne $null)
当$error
为空时,$error -eq $null
将不返回任何内容(因此在bool语句中为False
)。这当然是因为在$error中没有匹配$null的元素。同样,$error -ne $null
也将不返回任何内容(因此在bool语句中为False
),因为$error为空,其中没有任何不是$null的元素。
因此,当$error
为空时,你的语句将为false,并且if内部的块不会被执行。
如果$error
不为空,则其中任一条件都将为true,并且你将看到write-host
被执行。
那么,你如何真正解决这个问题呢?
直接的方法是检查$error
数组的长度:
if($error.length -gt 0){
write-host "error occured"
}
此外,阅读本文介绍的各种错误处理策略 - http://blogs.technet.com/b/heyscriptingguy/archive/2011/05/12/powershell-error-handling-and-why-you-should-care.aspx
-ne
。 - manojlds$error.clear()
(在生成错误之前这是有意义的),那么$error.length
将是未定义的,即返回错误无法在此对象上找到属性“length”。请验证该属性是否存在。
因此,我认为这个答案是不可接受的。 - Marc