首页 > 解决方案 > 为什么将 true 分配给变量它不会评估 true?

问题描述

$test = true
if($test) {
  Write-Output "true"
} else {
  Write-Output "false"
}

输出为“假”,但为什么呢?我将true和分配false给 COM 对象属性,它似乎工作正常......我做错了吗?什么时候适合在 PowerShell中使用truevs ?$true

编辑:一些用户提到我应该看到一个错误,但我没有。我已经尝试过 PowerShell 2.0 (Windows 7) 和 PowerShell 4.0 (Windows 8.1)。并且确实像我说的那样更改 COM 属性truefalse

编辑:事实证明,我们正在分配true给 COM 属性,但它们实际上收到了错误。我们的路径中有 gnuwin32 程序,其中两个程序是正确的和错误的:

C:\gnuwin32\bin\true.EXE
C:\gnuwin32\bin\false.EXE

因此,在那些计算机上,诸如$x = true运行C:\gnuwin32\bin\true.EXE没有输出且$x为空的命令之类的东西。没有人知道这一点,打算设置为 true 的 com 属性实际上并没有这样设置。

标记为正确的答案解释了“真相”,并且该值实际上是一个空值,这有助于我弄清楚。

标签: powershellbooleanboolean-expression

解决方案


由于问题是为什么会发生,让我在回答中深入研究细节


if($test)检查名为truthy的东西。基本上,它将表达式的结果转换为布尔值,然后检查它是真还是假。您可以在该答案中阅读更多相关信息。

在您的情况下,正如Martin Brandl 在他的有用答案中提到的那样,尝试分配$test = true将(在大多数情况下)导致异常,但代码继续执行

注意:粗体的陈述并不总是正确的,因为它取决于$ErrorActionPreferrence但在您的情况下它是正确的,因为您提到您收到了输出。

赋值失败后,值为$test-$null可以通过以下方式查看:

$test -eq $null

$null是错误值,因此您的表达式if()计算结果为$false并执行关键字之后的代码else,因此False在您的输出中。


推荐阅读