Powershell 为什么';正确';等于$true

Powershell 为什么';正确';等于$true,powershell,Powershell,我不太确定这个问题是否重复,但我找不到关于stackoverflow的具体问题,所以我猜不是 $true是一种布尔类型: ($true).getType() IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True Boolean

我不太确定这个问题是否重复,但我找不到关于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
,它会打印一个
无法将字符串转换为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’这个问题答案的人来说,这个问题现在给出了一个完美的解释。它们很好。帮助人们获得正确的信息。