【问题标题】:Why is $false -eq "" true?为什么 $false -eq "" 是真的?
【发布时间】:2014-09-24 10:52:59
【问题描述】:

以下代码段输出true:

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

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

既然$false和""是不同的数据类型,不应该自动等于false吗?

【问题讨论】:

  • 在 PowerShell 中,长度为 0 的字符串被评估为 false。 This 提到它,但我正在寻找其他东西。
  • 如果你这样做("" -eq $false) 结果是假的。
  • 没错。答案解释了原因。

标签: powershell


【解决方案1】:

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

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

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

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

True

$false 的字符串值是 'False',它是一个非空字符串,当被转换回 [bool] 时,计算结果为 $true

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

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

在第一次比较中,值 $false 被自动转换为字符串以匹配第一个操作数 ('') 的类型,因此您实际上是在比较 '' -eq 'False',其计算结果为 @987654334 @。

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

【讨论】:

  • 感谢您的回答。但是当你说“空字符串”时,你的意思是空字符串,对吧?因为空字符串和空字符串是两个不同的东西。
  • 从技术上讲,它们是不同的东西,但是当转换为 [bool] 时,任何一个都会评估为 $false。
【解决方案2】:

这里只是分享一个可能值得注意的经验当我们将字符串值转换为布尔值时

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

$valueReadFromFile = "false"

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

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

但我走错了方向。每次打印以下消息时,因为 PowerShell 中的非空字符串被强制转换为文字布尔值 $true

在当前情况下不应打印此消息

当我的程序开始出现错误时,我进行了更多探索并了解了转换类。我将我的代码修复如下:

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

【讨论】:

    猜你喜欢
    • 2014-02-16
    • 2023-02-01
    • 1970-01-01
    • 2016-12-13
    • 1970-01-01
    • 1970-01-01
    • 2015-05-09
    • 2023-03-09
    • 1970-01-01
    相关资源
    最近更新 更多