Powershell - if($variable) 测试什么?

问题描述 投票:0回答:2

在 Powershell 中,

if($variable)
测试什么? 这是测试变量是否已设置、为 null、为 true 还是其他什么?

powershell
2个回答
9
投票

它测试变量是否为 true 或者非布尔变量是否可以合并为 true。 例如,其中每一个都返回 false:

$var #uninitialized
$var = ""
$var = $false
$var = 0
$var = @()  # empty array

其中每一个都返回 true:

$var = "something"
$var = $true
$var = 1 #or any non-zero number
$var = @{}  # empty hashtable

6
投票

Powershell 使用松散类型,作为其中的一部分,任何值都可以用作条件表达式。将值评估为 true 或 false(此类值通常称为“true”和“falsey”)的逻辑位于 System.Management.Automation.LanguagePrimitives.IsTrue 函数中。逻辑如下:

  • $null
    评估结果为 false。
  • $true
    $false
    有其通常的含义。
  • 如果数值(int、double、decimal 等)非零,则该数值为真。
  • 如果字符串非空,则该字符串为真。
  • 如果调用者提供了开关参数,则其计算结果为 true。
function Test 
{
   param ( [switch]$Option )
}

Test # $Option evaluates to false
Test -Option # $Option evaluates to true

# (Technically, $Option is not bool; it is of type SwitchParameter which, 
# for almost all intents and purposes, can be used interchangeably with bool.)
  • 集合(实现
    IList
    )使用以下逻辑:空集合是假的;仅包含一个元素的集合评估其成员的真值;包含两个或多个元素的集合是真实的。
  • 其他都是真的。

有几个问题:

  • char类型不是数字类型。事实上,
    [System.Management.Automation.LanguagePrimitives]::IsTrue([char]0)
    返回True(根据最后一个子句);然而
    if([char]0) { "Truthy" } else { "Falsey" }
    返回“Falsey”。我无法找到发生这种情况的原因。
  • 如上所述,只有一个元素的集合是通过评估其成员来评估的。那么,如果您尝试评估一个仅包含其自身的集合(或者一个递归或非常深层嵌套的集合链,每个集合都有一个元素),会发生什么情况?为了科学,你可以测试一下:
$array = New-Object -TypeName System.Object[] 1 # $array = new object[1]
$array[0] = $array
if($array) { "Truthy" } else { "Falsey" }

(答案是:它会因 StackOverflowException 导致进程崩溃。)

© www.soinside.com 2019 - 2024. All rights reserved.