PowerShell—生成多个结果的if语句条件 请考虑这个愚蠢的例子: if (1..3) { "true" }
上述操作将生成输出truePowerShell—生成多个结果的if语句条件 请考虑这个愚蠢的例子: if (1..3) { "true" },powershell,Powershell,上述操作将生成输出true 我的问题是:if语句如何处理这样的情况,即条件语句输出多个值?“真”输出是否为“3”(最后一种情况)的结果?还是其他逻辑在起作用?谢谢。1..3生成一个包含3项的数组 PS> (1..3).GetType() IsPublic IsSerial Name BaseType -------- -------- ----
我的问题是: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如何准确地计算特定的表达式。这是一个你需要问开发者的问题。