为什么'true'等于$ true

时间:2016-05-20 11:18:29

标签: powershell

我不太确定这个确切的问题是否重复,但我无法在stackoverflow上找到我的具体问题,所以我猜它不是。

$true是一个布尔类型:

($true).getType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Boolean                                  System.ValueType

'true'是一个字符串:

('true').gettype()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     String                                   System.Object

为什么这种情况属实?

PS C:\WINDOWS\system32> if ('True' -eq $true) {'yes'} else {'no'}
yes

只是因为字符串被称为True,就像布尔值true一样?如果我将它与任何其他字符串进行比较,则会有不同的结果:

PS C:\WINDOWS\system32> 'hello' -eq $true
False
PS C:\WINDOWS\system32> 'true' -eq $true
True

如果在C#中执行'true' == true,则会输出cannot convert string to bool错误,并且C#和PS都基于.net并具有完全相同的语法。为什么有不同的结果? 这对我来说似乎很奇怪。

PowerShell如何评估'true'$true

1 个答案:

答案 0 :(得分:4)

在PowerShell中,运算符重载由左侧( lhs )参数决定。

这意味着当您提供一个字符串作为lhs参数时,解析器也会尝试将右侧( rhs )转换为字符串。

当转换为字符串时,$true以字符串“True”出现 - 由于PowerShell的字符串比较运算符在默认情况下都不区分大小写,因此恰好等于“true”。

此操作:

'true' -eq $true

被解释为

'true' -eq 'True'

恰好是$true,满足您的if条件。

对于$true,这也恰好相反,因为非空字符串在转换为布尔值时会计算为$true

换句话说

$true -eq 'true'

被解释为

$true -eq $true

这可能导致混淆,因为字符串“false”将偶然评估为$true,因为字符串“false”不为空:

PS C:\> $true -eq "true"
True
PS C:\> $true -eq "false"
True
PS C:\> $true -eq ""
False