为什么将 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",但为什么呢?我将 true
和 false
分配给 COM 对象属性,它似乎工作正常......我做错了什么吗?什么时候在 PowerShell 中使用 true
与 $true
比较合适?
编辑:有些用户提到我应该看到错误,但我没有。我在 PowerShell 2.0 (Windows 7) 和 PowerShell 4.0 (Windows 8.1) 中都试过了。 true
和 false
确实像我说的那样改变了 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
设置为 Continue 或 Stop 以捕获这些类型的错误。
由于问题是为什么它会发生,让我在我的回答中深入探讨细节
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"
}
$test = true
if($test) {
Write-Output "true"
} else {
Write-Output "false"
}
输出是"false",但为什么呢?我将 true
和 false
分配给 COM 对象属性,它似乎工作正常......我做错了什么吗?什么时候在 PowerShell 中使用 true
与 $true
比较合适?
编辑:有些用户提到我应该看到错误,但我没有。我在 PowerShell 2.0 (Windows 7) 和 PowerShell 4.0 (Windows 8.1) 中都试过了。 true
和 false
确实像我说的那样改变了 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
设置为 Continue 或 Stop 以捕获这些类型的错误。
由于问题是为什么它会发生,让我在我的回答中深入探讨细节
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"
}