3

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

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

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

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

我发现它的 Powershell 版本是 3.0。

4

2 回答 2

6

@mjolinor'sanswer 试图解释它,但不完整。

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

于 2013-04-08T04:16:42.610 回答
1

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

($error -eq $null) 说“我想要 $error 数组列表的所有成员都是空值。” 它只能返回 $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
于 2013-04-08T02:22:50.133 回答