以下代码段输出为true:
$x = ($false -eq "")
Write-Host $x
$x = ($false -eq 0)
Write-Host $x
因为$ false和""是不同的数据类型,不应该自动等于假?
答案 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())