我不太确定这个确切的问题是否重复,但我无法在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
?
答案 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