最近我必须检查执行脚本时是否发生了一些错误。首先,我试图检查$ Error是否为$ null。对我来说奇怪的是我没有得到任何结果(既不是真,也不是假)。然后我写道:
if (($error -eq $null) -or ($error -ne $null)) {Write-Host "NULL"}
输出中没有任何内容。这让我非常困惑。我发现所有变量都是System.Collections.ArrayList类型的。
也许有人知道为什么会发生这种情况,因为对我来说这看起来像个错误?
我发现这个版本的Powershell版本是3.0。
答案 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的元素。与-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,并且如果不执行则将在内部阻止。
如果$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