为什么'$ true -eq“string”'返回$ true?

时间:2014-10-24 09:57:11

标签: string powershell boolean compare equals

在powerShell中,将布尔值与带有“-eq”运算符的字符串进行比较,它将始终返回与我用于比较的布尔值相同的布尔值。

E.g。

$shouldBeFalse = $true -eq "hello"
$shouldBeTrue = $false -eq "hello"

变量$ shouldBeFalse是$ true。 变量$ shouldBeTrue是$ false。

我不得不使用“Equals”方法:

$shouldBeFalse = $true.Equals("hello")

在这种情况下,$ shouldBeFalse为$ false。

但为什么返回带有布尔值的-eq运算符这类结果?

2 个答案:

答案 0 :(得分:9)

PowerShell将始终使用左侧参数的类型进行评估。由于你左边有一个布尔值,PowerShell会尝试和#34; Hello"作为布尔值,用于使用-eq进行评估。

因此,在您的情况下,"hello"将转换为布尔值[bool]"hello",它将评估为True,因为它不是零长度字符串。如果你做了相反的事情,你会看到类似的行为。

PS C:\> "hello" -eq $true
False

PS C:\> [bool]"hello" -eq $true
True

在第一种情况下,$true被转换为字符串" true"这不等于"你好"因此是假的。在第二种情况下,我们演员"你好"为布尔值,-eq将比较布尔值。由于上述原因,评估为True。

另一个很好的解释来自这个答案,可能会将您的问题标记为重复:Why is $false -eq "" true?

答案 1 :(得分:-1)

$TRUE> 0"hello" length > 0所以它是TRUE$FALSE== 0"hello" length < 0,因此为FALSE

使用Equals时,会将var作为字符串进行比较,因此$TRUE不等于hello -> FALSE

来源:http://blogs.msdn.com/b/powershell/archive/2006/12/24/boolean-values-and-operators.aspx