PowerShell逻辑运算符和$Error变量

3

最近,我需要检查当我的脚本执行时是否出现了一些错误。首先我尝试检查$Error是否为$null。令我感到奇怪的是,我没有从中得到任何结果(既非True也非False)。然后我写了:

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

输出结果为空,这让我很困惑。我发现所有类型为System.Collections.ArrayList的变量都会出现这种情况。

也许有人知道为什么会这样,因为在我看来,这好像是一个bug?

我遇到这个问题的Powershell版本是3.0。

2个回答

6

@mjolinor的回答试图解释这个问题,但是不完整。

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

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

如果$error不为空,则其中任一条件都将为true,并且你将看到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


那个答案到底有什么“错误”? - mjolinor
@mjolinor - “所以并不是所有情况下-eq运算符在处理数组时都会像上面的情况一样表现。” - manojlds
@mjolinor - 这个回答哪里是正确的?抱歉,它甚至没有提到 OP 在问题中使用的 -ne - manojlds
我同意这段代码不完整,因为它没有涉及-ne。但是我并不认为在当前问题中有什么“错误”,也不知道为什么你的答案就一定是“正确”的。如果你将数组列表放在右侧,那么我同意这段代码会产生你所描述的结果,但他并没有这样做。在这两个表达式中,arrlist ($error) 都在左侧。 - mjolinor
如果您执行$error.clear()(在生成错误之前这是有意义的),那么$error.length将是未定义的,即返回错误无法在此对象上找到属性“length”。请验证该属性是否存在。因此,我认为这个答案是不可接受的。 - Marc

1
当使用-eq运算符针对数组(或arraylist)时,它返回满足条件的数组的所有成员。
($error -eq $null)表示“我想要所有$ error arraylist中为null的成员”。 它除了$ 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

有趣的 ((1,$null,2) -eq $null)[0] -eq $null -eq 输出和数组 - Andy Arismendi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接