Powershell 为什么';正确';等于$true
我不太确定这个问题是否重复,但我找不到关于stackoverflow的具体问题,所以我猜不是Powershell 为什么';正确';等于$true,powershell,Powershell,我不太确定这个问题是否重复,但我找不到关于stackoverflow的具体问题,所以我猜不是 $true是一种布尔类型: ($true).getType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Boolean
$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
,它会打印一个无法将字符串转换为bool
错误,并且C#和PS都基于.net并具有完全相同的语法。为什么会有不同的结果?
这对我来说似乎很奇怪
PowerShell如何将
'true'
评估为$true
?在PowerShell中,运算符重载由左侧(lhs)参数确定
这意味着,当您提供字符串作为lhs参数时,解析器将尝试将右侧(rhs)也转换为字符串
当强制转换为字符串时,$true
显示为字符串“true”-由于PowerShell的字符串比较运算符默认都不区分大小写,因此正好等于“true”
此操作:
'true' -eq $true
被解释为
'true' -eq 'True'
$true -eq $true
正好是$true
,满足if
条件
对于
$true
,情况正好相反,因为非空字符串在转换为布尔值时,计算结果为$true
:
换句话说
$true -eq '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
$true-eq'true'
也是true。因此,如果字符串的值与布尔值相同,Powershell也可以将其转换为布尔值?正确-非空字符串的计算结果为$true
,空字符串的计算结果为$false
,乍一看可能有点违反直觉,但一旦您知道运算符始终由lhs类型决定,您就可以轻松预测其行为,因此,是的,我想说得很好:)@Matt不完全是。他们都提到为什么$true-eq'string'=true,我的问题是为什么确切的字符串'true'-eq$true而任何其他的'string'-eq$true是false。我也看到了你提到的那些问题,但它们不是sameI删除的,因为这不是一个完美的骗局。然而,所有的答案都涉及LHS和RHS参数和类型转换,因此确实适用。你指的是一个具体的案例,所以它可以正常工作。如果你阅读了其他可能相关的问题,你应该将它们链接到这里,并尝试解释它们没有回答你的问题的地方。@Matt我完全同意。答案是一样的。也许我太震惊了,PowerShell评估了这样的东西,所以我没有足够仔细地阅读答案;-)。然而,对于那些搜索“为什么‘真’-eq$true’这个问题答案的人来说,这个问题现在给出了一个完美的解释。它们很好。帮助人们获得正确的信息。