powershell逻辑运算符和$ Error变量

时间:2013-04-08 01:20:16

标签: powershell

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

if (($error -eq $null) -or ($error -ne $null)) {Write-Host "NULL"}

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

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

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

2 个答案:

答案 0 :(得分: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的元素。与-eq1 -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,并且如果不执行则将在内部阻止。

如果$error不为空,则其中任何一个条件都是真的,并且您会看到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

答案 1 :(得分:1)

当对数组(或arraylist)使用-eq运算符时,它返回满足条件的数组的所有成员。

($ error -eq $ null)说“我希望$ error arraylist的所有成员都为空。”除了$ 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