为什么将 true 分配给变量它不会评估 true?

Why does assigning true to variable it will not evaluate true?

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

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

编辑:有些用户提到我应该看到错误,但我没有。我在 PowerShell 2.0 (Windows 7) 和 PowerShell 4.0 (Windows 8.1) 中都试过了。 truefalse 确实像我说的那样改变了 COM 属性。

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

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

所以在那些计算机上,像 $x = true 这样的东西运行命令 C:\gnuwin32\bin\true.EXE,它没有输出并且 $x 是空的。没有人知道这一点,旨在设置为 true 的 com 属性实际上并没有那样设置。

标记为正确的答案解释了 "truthy" 并且该值实际上是一个空值,这帮助我弄明白了。

你的第一行 $test = true 可能会抛出以下异常(除非你的 $ErrorActionPreference 设置为 SilentlyContinue):

true : The term 'true' is not recognized as the name of a cmdlet, function, script file, or operable program. Check the spelling of the name, or if a path was included, verify that the path is correct and try again.
At line:1 char:9
+ $test = true
+         ~~~~
    + CategoryInfo          : ObjectNotFound: (true:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

如果您不想 $test 是一个值为 1 (true) 的布尔值,那么您必须像这样分配它: $test = $true.

为什么输出是'false'?

如前所述,$test = true 将抛出异常,因此 $test 未声明/定义。我建议您将 $ErrorActionPreference 设置为 ContinueStop 以捕获这些类型的错误。

由于问题是为什么它会发生,让我在我的回答中深入探讨细节


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

在您的情况下,如 ,尝试分配 $test = true 将(在大多数情况下)导致异常,但 代码将继续执行 .

NOTE: The statement in bold is not always true as it depends on $ErrorActionPreferrence but in your case it's true as you mentioned that you receive the output.

赋值失败后,$test的值为$null——可以通过:

查看
$test -eq $null

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

Unix "true" 和 "false" 命令不同于 powershell $true 和 $false。 unix 只设置退出代码,但不提供输出。 powershell 变量给出一个布尔值输出。这是测试上一个命令的退出代码的解决方法:

$test = $(true.exe; $?) # $test gets set to boolean True
if($test) {
  Write-Output "true"
} else {
  Write-Output "false"
}