最近我必须检查脚本执行时是否发生了一些错误.首先,我试图检查$ 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.
@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
| 归档时间: |
|
| 查看次数: |
6296 次 |
| 最近记录: |