powershell逻辑运算符和$ Error变量

3 powershell

最近我必须检查脚本执行时是否发生了一些错误.首先,我试图检查$ Error是否为$ null.对我来说奇怪的是我没有得到任何结果(既不是真,也不是假).然后我写道:

if (($error -eq $null) -or ($error -ne $null)) {Write-Host "NULL"}
Run Code Online (Sandbox Code Playgroud)

输出中没有任何内容.这让我非常困惑.我发现所有变量都是System.Collections.ArrayList类型的.

也许有人知道为什么会发生这种情况的解释,因为对我来说这看起来像个错误?

我发现这个版本的Powershell版本是3.0.

man*_*lds 6

@mjolinor's 答案试图解释它,但不完整.

当你这样做时(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将不返回任何内容(因此False在bool语句中).这当然是因为$null$ error中没有元素匹配.此外,$error -ne $null还将返回任何内容(因此False在bool语句中),因为$ error为空,并且其中没有元素不是$ null.

因此,当$error为空时,您的语句将为false,如果不执行,则内部的块.

如果$error不是空的,那么任何条件都是真的,你会看到write-host执行的.

那么你如何真正解决这个问题呢?

直截了当的方法是检查$error数组的长度:

if($error.length -gt 0){
    write-host "error occured"
}
Run Code Online (Sandbox Code Playgroud)

另外,阅读本文讨论各种错误处理策略 - http://blogs.technet.com/b/heyscriptingguy/archive/2011/05/12/powershell-error-handling-and-why-you-should-care的.aspx