8

看着关于 PowerShell 的_Comparison_Operators 的帮助部分,我明白了这一点:

PS C:\> $false,$false -eq $true
PS C:\> 

左侧没有任何内容与右侧匹配,因此没有返回任何内容,甚至没有$null.

我不明白这一点:

PS C:\> $true -eq $false,$false
True
PS C:\> 

是不是因为它首先执行$true -eq $false返回False,然后采取该False并执行$false -eq $false返回True

更多信息

下面返回 false 的原因是因为它将字符串与数组进行比较,对吗?字符串不等于数组。

PS C:\> "abc" -eq "abc","def"
False

回答?

更多的挖掘表明它$true等于一个物体。

PS C:\> $true -eq [array]
True
PS C:\> $true -eq [string]
True
PS C:\> $true -eq [int]
True
PS C:\> $true -eq [bool]
True

重要的是这些对象的值。

PS C:\> $true -eq [int]0
False
4

3 回答 3

7

我喜欢这样的关于语言的行为和特性的基本问题……给我一个阅读 PowerShell 语言规范的借口。

您可以下载上述规范:2.03.0。请参阅第 7.8.1 节 - 相等和关系运算符。

对于问题的第一部分,实际上返回了一些东西 - 一个空数组,如下所示:($false,$false -eq $true).psbase

Length         : 0
LongLength     : 0
Rank           : 1
SyncRoot       : {}
IsReadOnly     : False
IsFixedSize    : True
IsSynchronized : False
Count          : 0

从规格 -

如果左操作数指定的值不是集合,则结果为 bool 类型。否则,结果是一个可能为空的无约束一维数组,其中包含与右操作数指定的值进行比较时测试为 True 的集合元素。

对于第二部分,因为左操作数本身就是一个布尔值,我认为它总是结果。仅当右操作数是一个集合时。

一些例子:

$true -eq 1,2,3,4
$true -eq '','','',''
$true -eq '',1,$true,$false
$true -eq $null,$false,1,''

所有这些回报$true。相反,所有这些都返回$false

$false -eq 1,2,3,4
$false -eq '','','',''
$false -eq '',1,$true,$false
$false -eq $null,$false,1,''
$false -eq $true,$true,$true

左操作数的类型非常重要。这将返回$true:$false -eq 0因为右操作数可以转换为左操作数的类型。

于 2013-04-09T22:14:28.530 回答
3

最佳的揣测:

它评估为 True 因为它是一个包含多个成员的数组。数组没有 ToBoolean() 方法。

只要它是一个标量,或者一个只有一个成员的数组,Powershell 就可以将它强制转换为一个标量并获取该成员的 ToBoolean() 方法。只要它达到 2 或更多,它总是返回 True,不管元素是什么。如果没有 ToBoolean(),并且它回退到默认的 ToString() 方法,那么它总是会评估为 True。

或者可能不是。

于 2013-04-09T22:09:46.303 回答
2

也许-eq运营商正在评估他们的存在(也就是 not $null)而不是他们的价值。

也许类似于 IF 语句?

PS> if("anyval"){$true}else{$false}
True

@Joey 提供的这个答案也可能很有用。

于 2013-04-09T21:52:55.057 回答