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

Ast*_*ium 4 string powershell boolean compare equals

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

例如

$shouldBeFalse = $true -eq "hello"
$shouldBeTrue = $false -eq "hello"
Run Code Online (Sandbox Code Playgroud)

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

我不得不使用"Equals"方法:

$shouldBeFalse = $true.Equals("hello")
Run Code Online (Sandbox Code Playgroud)

在这种情况下,$ shouldBeFalse是$ false.

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

Mat*_*att 10

PowerShell将始终使用左侧参数的类型进行评估.由于左侧有一个布尔值,因此PowerShell会尝试将"Hello"转换为布尔值,以便进行评估-eq.

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

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

PS C:\> [bool]"hello" -eq $true
True
Run Code Online (Sandbox Code Playgroud)

在第一种情况下$true转换为字符串"true",它不等于"hello"因此为false.在第二种情况下,我们将"hello"转换为boolean,因此-eq将比较布尔值.由于提到的原因,此评估为True.

另一个很好的解释来自这个答案,它可能会将你的问题标记为重复:为什么$ false -eq""是真的?