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

Bob*_*Bob 8 powershell

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

mor*_*rgb 9

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

$var #uninitialized
$var = ""
$var = $false
$var = 0
Run Code Online (Sandbox Code Playgroud)

其中每一个都返回 true:

$var = "something"
$var = $true
$var = 1 #or any non-zero number
Run Code Online (Sandbox Code Playgroud)

  • “*它测试变量是否包含某些内容*” - 不完全是;在 PowerShell 中,空数组为 $false,但空哈希表为 $true。(与 Python 不同,空字典是错误的)。 (2认同)
  • 这是一个很好的答案,但更具体地说,它测试某些内容是否为“$true”或可以合并到“$true”。换句话说,存在对“[bool]”的隐式转换,这样条件将使用“[bool]$var”的值。正如此答案所指出的和 TesselttingHeckler 所扩展的那样,哪些值评估为“$true”或“$false”的详细信息有所不同。 (2认同)

Mik*_*oft 5

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

  • $null评估结果为假。
  • $true$false具有其通常的含义。
  • 如果数值(int、double、decimal 等)非零,则该数值为真。
  • 如果字符串非空,则该字符串为真。
  • 如果调用者提供了 switch 参数,则该参数的计算结果为 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.)
Run Code Online (Sandbox Code Playgroud)
  • 集合(实现IList)使用以下逻辑: 空集合是 falsey;仅包含一个元素的集合评估其成员的真值;包含两个或多个元素的集合是真实的。
  • 其他的都是实话。

有几个问题:

  • 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" }
Run Code Online (Sandbox Code Playgroud)

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