2013-04-08 185 views
2

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

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

没有什么是在输出。这让我非常困惑。我发现这样的事情发生在System.Collections.ArrayList类型的所有变量上。

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

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

回答

5

@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将返回任何结果(并因此False在布尔语句)。这当然是因为在$ error中没有匹配$null的元素。此外,$error -ne $null也不会返回任何内容(因此在bool语句中为False),因为$ error是空的,并且其中没有非$ null的元素。

因此,当$error为空时,您的语句将为false,并且if内部的块将不会执行。

如果$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

+0

关于该答案的“错误”究竟是什么? – mjolinor 2013-04-08 04:22:47

+0

@mjolinor - '因此,-eq操作符在数组方面总是表现得像上述情况一样。 – manojlds 2013-04-08 04:30:24

+0

@mjolinor - 答案的正确答案是什么?对不起,它甚至没有提到OP在这个问题中使用的'-ne'。 – manojlds 2013-04-08 04:33:29

1

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

($ error -eq $ null)说:“我希望所有的$ error arraylist的成员都是空值。”它不能返回任何东西,但$ null。

当您在IF中使用它时,结果将被转换为[bool]。当作为[bool]转换时,$ Null的计算结果为$ false。

($ error -eq $ null)永远不会为True。

$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 
+0

有趣'((1,$空,2)-eq $ null)[0] -eq $ null'' -eq'输出和数组 – 2013-04-08 06:39:15