gpt4 book ai didi

powershell - 测试PSCustomObject的属性时,为什么操作数的顺序很重要

转载 作者:行者123 更新时间:2023-12-02 23:20:27 24 4
gpt4 key购买 nike

我在if语句中尝试了$psCustomObject.x -eq $null$null -eq $psCustomObject.x的两种情况,只有后者通过了if。
为什么这样表现呢?看来不合逻辑。

我的特定用例是一个json文件,其中包含多个环境的配置。环境的名称是对象中的关键,我的目标是在目标不存在的环境(可能是拼写错误)时通知用户,然后停止。

我不想使用! opreator,因为它具有极高的信息与代码比率-很容易忽略,但是却有很大的不同,因此,我通常不喜欢它。它还需要了解该语言的工作原理(powershell不是静态类型的,我不希望读者需要了解什么是真理还是不真理)。这听起来可能很愚蠢,但是powershell不是我的主要语言,也不是我的同事的语言。可读性是我的关键因素。

最佳答案

tl;博士

要将值与$null-eq进行比较,始终将-ne设置为LHS :

$null -eq $psCustomObject.x  # NOT $psCustomObject.x -eq $null
  • 操作数的顺序很重要,因为PowerShell中的比较运算符充当具有数组值LHS值的过滤器。
  • 此外,即使与$null之外的其他内容进行比较,由于隐式类型转换,操作数的顺序也可能很重要。


  • PowerShell的comparison operators, such as $null 在设计上与数组值的LHS 行为不同,因此 哪一个操作数对至关重要,即使对于通常可交换的运算符
    -eq-eq
  • 使用标量LHS (单个值),比较运算符返回 bool(boolean) 值(-ne$True,指示比较结果。
  • 然而,正如Jeff Zeitlin所指出的,即使具有标量操作数放置,也很重要,即具有不同类型的操作数:通常,在比较之前,RHS操作数被强制为LHS的数据类型;例如,$False执行字符串比较(将整数' 2 ' -eq 2强制转换为字符串2)并因此返回'2',而$False执行整数比较(将字符串2 -eq ' 2 '转换为' 2 ')并因此返回[int]
  • 使用数组值的LHS (作为集合的LHS值),比较运算符返回数组($True),因为它充当过滤器:运算符分别应用于输入数组的元素,返回的是操作为其返回[object[]]的那些元素的子数组。

  • 请注意,从Windows PowerShell v5.1 / PowerShell Core 6.1.0开始,PowerShell仅支持将数组值的操作数用作LHS操作数。 RHS操作数必须为标量或被强制为1。[1]

    因此,在您的示例中, $True$null -eq $psCustomObject.x不可互换,并测试不同的条件:
    # Is the RHS $null?
    # Whether the concrete RHS value is then a scalar or an array doesn't matter.
    $null -eq $psCustomObject.x

    # * If $psCustomObject.x is a scalar: is that scalar $null?
    # * If $psCustomObject.x is an ARRAY:
    # RETURN THE SUB-ARRAY OF ELEMENTS THAT ARE $null
    $psCustomObject.x -eq $null

    在 bool(boolean) 上下文中(例如 $psCustomObject.x -eq $null语句中)使用 时,对数组(例如,以数组值的LHS返回的数组)进行排序时,的计算方式如下:向PetSerAl求助帽子的技巧。
  • 一个空数组或包含一个空数组的1元素数组的结果为if
  • 包含标量的1元素数组求值为该标量的(隐含) bool(boolean) 值,例如$False实际上与[bool] @(0)(即[bool] 0)相同。
  • 2+元素数组或包含非空数组的1元素数组始终为$False,无论其元素值如何(例如,$True[bool] ($False, $False)都是[bool] (, (, $False))

  • 注意:术语“数组”在上面宽松地使用。严格来说,以上内容适用于实现 $True 接口(interface)的任何类型的实例-请参见the source code
    除了数组之外,还包括[System.Collections.IList][System.Collections.ArrayList]之类的类型。

    两种比较在 bool(boolean) 上下文中的评估结果不同时的示例:

    注意:
  • 这个例子有些人为-请告诉我们是否有更好的例子。
    可以使用[System.Collections.Generic.List[<type>]]运算符提供更简单的示例。
  • 我无法为您描述的特定行为提供一个示例,其中-ne返回$null -eq $psCustomObject.x,但$True不。如果确实如此,请告诉我们所涉及的特定$psCustomObject.x -eq $null值。

  • # Construct a custom object with an array-valued .x property that
    # contains at least 2 $null values.
    $psCustomObject = [pscustomobject] @{ x = @(1, $null, 2, $null) }

    # $False, as expected: the value of .x is an array, and therefore not $null
    [bool] ($null -eq $psCustomObject.x)

    # !! $True, because because 2 elements in the input array (.x)
    # !! are $null, so a 2-element array - ($null, $null) - is returned, which in a
    # !! Boolean context is always $True.
    [bool] ($psCustomObject.x -eq $null)

    [1]在文档中,.x与比较运算符组合在一起,从技术上讲,它的RHS是一个数组,但是此数组的元素本质上是标量操作数:要匹配的正则表达式和替换字符串。

    关于powershell - 测试PSCustomObject的属性时,为什么操作数的顺序很重要,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52152438/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com