PowerShell—生成多个结果的if语句条件 请考虑这个愚蠢的例子: if (1..3) { "true" }

PowerShell—生成多个结果的if语句条件 请考虑这个愚蠢的例子: if (1..3) { "true" },powershell,Powershell,上述操作将生成输出true 我的问题是:if语句如何处理这样的情况,即条件语句输出多个值?“真”输出是否为“3”(最后一种情况)的结果?还是其他逻辑在起作用?谢谢。1..3生成一个包含3项的数组 PS> (1..3).GetType() IsPublic IsSerial Name BaseType -------- -------- ----

上述操作将生成输出true


我的问题是:if语句如何处理这样的情况,即条件语句输出多个值?“真”输出是否为“3”(最后一种情况)的结果?还是其他逻辑在起作用?谢谢。

1..3生成一个包含3项的数组

PS> (1..3).GetType()

IsPublic IsSerial Name                                     BaseType
-------- -------- ----                                     --------
True     True     Object[]                                 System.Array

PS> (1..3).Length
3
如果数组中至少有一项,则If会认为它为真

PS> if (@()) { "true" } else { "false" }
false

PS> if (@(1)) { "true" } else { "false" }
true

PS> if (@(1,2)) { "true" } else { "false" }
true
如上所示,输出结果为true

为什么您希望它输出“true”

if语句如何处理条件语句输出多个值的情况

条件不“输出”任何值。它的计算结果总是“真”或“假”。剩下的问题是,为什么它的评估结果为真(或假)

代码

   if (1..3) { "true" }
等于

   if (@(1,2,3)) { "true" }
   $array = @(1,2,3)
   if ($array) { "true" }
等于

   if (@(1,2,3)) { "true" }
   $array = @(1,2,3)
   if ($array) { "true" }
表现为

   if ($array.Length -gt 0) { "true" }
因此,不会测试单个元素,而是测试数组是否包含任何元素

例如,以下内容不会打印“true”:

更新如果数组只包含一个值,那么它看起来(我找不到任何关于该值的规范性文档),就好像使用数组中的一个元素将数组视为标量值一样

所以

被视为

   if (0)  --> false
   if (0.0)  --> false
   if (1)  --> true
   if (-1)  --> true
   if ($null)  --> false
   if ("false") --> true

观察到的行为(在一定程度上)在中进行了解释。基本上,如果表达式的计算结果为0,它将被解释为false,否则将被解释为true。示例:

0      => False
1      => True
"0"    => True (because it's a string of length 1)
""     => False (because it's a string of length 0)
@()    => False
@(0)   => False (this one's a little surprising)
@(0,1) => True
@("0") => True

我不明白这为什么会被否决。我认为这是一个正确的问题,它指向了一些在powershell中没有很好记录的东西。+1@davor感谢您的支持。不是真的
@(0).length=1
但是如果(@(0)){“true”}尝试
,看看你得到了什么。当然也不是完全错误的。它看起来像一个角落的案件。请参阅我的更新。+1感谢Christian.K的解释。看起来@(0)被视为一个特例(或者你所说的角格)。逗号前缀在后两种情况下有什么作用?它只是创建数组的一种不同方式。看,不是真的@(0).length=1,但是试试if(@(0)){“true”},看看你得到了什么。你说:“如果一个表达式的计算结果为0”->“计算”是如何完成的?@Sabuncu我不熟悉PowerShell的内部工作原理,所以我无法解释PowerShell如何准确地计算特定的表达式。这是一个你需要问开发者的问题。