为什么$ false -eq""真正?

时间:2014-09-24 10:52:59

标签: powershell

以下代码段输出为true:

$x = ($false -eq "") 
Write-Host $x

$x = ($false -eq 0) 
Write-Host $x

因为$ false和""是不同的数据类型,不应该自动等于假?

2 个答案:

答案 0 :(得分:24)

进行比较操作时,PowerShell会自动尝试强制操作符右侧的对象与左侧的类型匹配。

在强制[string][bool]的情况下,任何非空字符串将评估为$true,而空字符串将评估为$false。有关将不同数据类型自动转换为布尔值的更多信息,请参阅博客文章 Boolean Values and Operators

这有时会导致意想不到的结果:

PS C:\> [bool]"$false" 

True

$false的字符串值为' False',这是一个非空字符串,并在转回$true时评估为[bool]

当操作数具有不同的数据类型时,它还使比较操作不可交换:

PS C:\> '' -eq $false
False
PS C:\> $false -eq ''
True

在第一次比较中,值$false会自动转换为字符串,以匹配第一个操作数('')的类型,因此您实际上正在比较{{1 },评估为'' -eq 'False'

在第二次比较中,字符串$false被自动转换为布尔值,再次是为了匹配第一个操作数的类型(''),所以这次你实际上是比较$false,其评估结果为$false -eq $false

答案 1 :(得分:0)

在这里分享一种体验,当我们将字符串值转换为布尔值时,可能值得注意

我正在做的是从配置文件中读取一个布尔字符串值,该文件存储在变量中,如下所示:

$valueReadFromFile = "false"

现在,我想将其转换为布尔值。由于我在PowerShell中不知道Convert类,所以我使用了强制转换,如下所示,在if块的bool条件中:

if([bool]$valueReadFromFile -eq $true)
{
    echo "This message shouldn't get printed in current scenario"
}

但我错了。每次下面的消息都被打印,因为PowerShell中的非空字符串被转换为文字布尔值$true

  

此消息不应在当前方案中打印

当我的程序开始表现不正确时,我探索了更多并且开始了解转换类。我修改了我的代码如下:

$actualBoolValue = [System.Convert]::ToBoolean($valueReadFromFile.Trim())