【问题标题】:Powershell - What does if($variable) test for?Powershell - if($variable) 测试什么?
【发布时间】:2016-08-08 14:19:59
【问题描述】:

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

【问题讨论】:

  • 这取决于变量的类型。这在 Python 和 JavaScript 中也很常见,一般来说,在这种情况下变成 $true 的东西被称为“真”,而在这种情况下变成 $false 的东西被称为“假”——尽管具体发生的事情是不同的用不同的语言。在 PowerShell 中 - blogs.msdn.microsoft.com/powershell/2006/12/24/…

标签: powershell


【解决方案1】:

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

$var #uninitialized
$var = ""
$var = $false
$var = 0

每个都返回 true:

$var = "something"
$var = $true
$var = 1 #or any non-zero number

【讨论】:

  • 谢谢,我继承了一些具有这种语法的代码,它似乎被用来表示不同的东西。如果可以的话,我会将此标记为已回答。
  • "它测试变量是否包含某些东西" - 不完全是;在 PowerShell 中,空数组是 $false,但空哈希表是 $true。 (不像 Python,空字典是错误的)。
  • 这是一个很好的答案,但更具体地说,它测试某个东西是$true 还是可以合并到$true。换句话说,有一个隐式转换为[bool],因此条件将使用[bool]$var 的任何值。正如这个答案所指出的那样,TessellatingHeckler 扩展了哪些值的详细信息评估为 $true$false
  • @briantist 这是一种更好的表达方式。我已经改写了答案。
【解决方案2】:

Powershell 使用松散类型,作为其中的一部分,任何值都可以用作条件表达式。将值评估为真或假(此类值通常称为“真”和“假”)的逻辑在 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.)
  • 集合(实现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 使进程崩溃。)

【讨论】:

    猜你喜欢
    • 2021-08-19
    • 2016-11-02
    • 2020-11-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-28
    • 2020-05-24
    • 1970-01-01
    相关资源
    最近更新 更多