Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
powershell逻辑运算符和$Error变量_Powershell - Fatal编程技术网

powershell逻辑运算符和$Error变量

powershell逻辑运算符和$Error变量,powershell,Powershell,最近,我不得不检查脚本执行时是否出现了一些错误。首先,我尝试检查$Error是否为$null。对我来说奇怪的是,我没有从中得到任何结果(既不是真的,也不是假的)。然后我写了: if (($error -eq $null) -or ($error -ne $null)) {Write-Host "NULL"} 输出中什么也没有。这让我很困惑。我发现所有System.Collections.ArrayList类型的变量都会发生这种情况 也许有人知道为什么会发生这种情况,因为对我来说这看起来像一个b

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

if (($error -eq $null) -or ($error -ne $null)) {Write-Host "NULL"}
输出中什么也没有。这让我很困惑。我发现所有System.Collections.ArrayList类型的变量都会发生这种情况

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


我在Powershell的版本中发现了这一点,它是3.0。

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

($error-eq$null)表示“我希望$error数组列表中的所有成员都为null。”它只能返回$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

@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)-或($error-ne$null)

$error
为空时,
$error-eq$null
将不返回任何内容(因此在bool语句中为
False
)。这当然是因为$error中没有匹配
$null
的元素。另外,
$error-ne$null
也将不返回任何内容(因此在bool语句中是
False
),因为$error是空的,并且其中没有非$null的元素

因此,当
$error
为空时,您的语句将为false,if中的块将不会执行

如果
$error
不是空的,则这两个条件中的任何一个都是真的,并且您会看到执行了
写主机

那么您真正如何解决这个问题呢?

最简单的方法是检查
$error
数组的长度:

if($error.length -gt 0){
    write-host "error occured"
}

另外,请阅读这篇讨论各种错误处理策略的文章-

该答案的“错误”到底是什么?@mjolinor-
因此,-eq运算符在数组中的行为并不总是与上述情况相同。
@mjolinor-答案的正确性是什么?抱歉,它甚至没有提到OP在问题中使用的
-ne
,我说了。我可以同意,这是“不完整的”没有解决的-ne。我看不出当前问题的“错”在哪里,或者为什么你的问题是“对”的。我同意如果你把数组列表放在右边,它会产生你描述的结果,但他没有这样做。arrlist($error)在两个表达式中都位于左侧。如果执行此操作,
$error.clear()
(这在生成错误之前是有意义的,然后
$error.length
是未定义的,即返回一个错误
此对象上找不到属性“length”。请验证该属性是否存在。
以便答案不可接受。有趣的
((1,$null,2)-eq$null)[0]-eq$null
-eq
输出和数组