Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/powershell/12.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays 在Powershell中测试null:为什么测试空数组的行为与测试空字符串的行为不同?_Arrays_Powershell_Types_Null - Fatal编程技术网

Arrays 在Powershell中测试null:为什么测试空数组的行为与测试空字符串的行为不同?

Arrays 在Powershell中测试null:为什么测试空数组的行为与测试空字符串的行为不同?,arrays,powershell,types,null,Arrays,Powershell,Types,Null,考虑一下这个代码 "Type: array" $v = @() " -eq `$null: $($v -eq $null)" " -ne `$null: $($v -ne $null)" "Type: string" $v = '' " -eq `$null: $($v -eq $null)" " -ne `$null: $($v -ne $null)" 这将产生以下结果: Type: array -eq $null: -ne $null: Type: string

考虑一下这个代码

"Type: array"
$v = @()
"  -eq `$null: $($v -eq $null)"
"  -ne `$null: $($v -ne $null)"

"Type: string"
$v = ''
"  -eq `$null: $($v -eq $null)"
"  -ne `$null: $($v -ne $null)"
这将产生以下结果:

Type: array
  -eq $null: 
  -ne $null: 
Type: string
  -eq $null: False
  -ne $null: True
  • 为什么
    -eq
    -ne
    对空字符串的行为与预期的一样,但对空数组的计算结果为null或empty

  • 更重要的是,如何区分
    $null
    和空数组


  • 对集合使用比较运算符时,它们不会返回布尔值($true或$false)。它们返回集合中满足条件的所有成员

    见:

    获取帮助

    @mjolinor’s是对问题(1)的简单而正确的回答。这个答案实际上引出了另外两个问题

    声明如下:

    当输入是一组值时 比较运算符返回任何匹配的值。如果没有匹配项 在集合中,比较运算符不返回任何内容

    这意味着该行为取决于Powershell在此上下文中对“集合”的定义。这也意味着交换比较运算符的LHS和RHS可能会产生实质性差异

    因此,除了最初的问题2,我们还有两个未回答的问题:

  • 如何区分
    $null
    和空数组
  • Powershell比较运算符将哪些类型视为集合
  • 交换比较运算符的LHS和RHS是否会产生差异
  • 剩下的这三个问题都可以通过使用本答案末尾的脚本进行经验回答

    测试结果 我们可以使用该表回答以下问题:

  • 如何区分
    $null
    和空数组
  • 将集合移动到运算符的RHS(例如,
    $null-eq@()
    )会为所有测试类型生成一个布尔值(请参见列
    coll\u RHS\u result
    )。这意味着
    $null-ne@()
    的计算结果与预期一致,这使我们能够可靠地检测
    $null
    @()
    之间的差异

  • Powershell比较运算符将哪些类型视为集合
  • coll\u LHS\u结果
    Object[]
    的每种类型

  • 交换比较运算符的LHS和RHS是否会产生差异
  • 的确如此。将集合放在操作符的LHS上会产生一个数组。将标量放在运算符的LHS上会产生一个布尔值

    测试脚本
    哦这有点道理。但是为什么
    @()-eq$null
    的计算结果不是真的呢?@alx9r这个答案可能取决于您的PowerShell版本。在3.0中,我的计算结果为False。@()-eq$null将返回等于$null的空数组的所有成员,因此结果将为null,而不是$true。请注意,$()-eq$null确实返回$true$()的计算结果为标量(单个)空值。@mjolinor您能告诉我(或链接到)
    $()
    的含义是什么吗?google和stackoverflow搜索都没有找到该字符串的任何内容。这是一个子表达式。请参阅获取有关_运算符的帮助。还有另一个有趣的相关问题-一般来说,对象(特别是集合)是如何转换/转换为布尔值(真/假)的,以便对语句进行求值的,例如
    if($x)
    ?答案在于
    系统、管理、自动化、语言原语。IsTrue
    CollectionType x_eq_Null coll_LHS_result Null_eq_x coll_RHS_result
    -------------- --------- --------------- --------- ---------------
    string             False Boolean             False Boolean        
    ArrayList             {} Object[]            False Boolean        
    Hashtable          False Boolean             False Boolean        
    Queue                 {} Object[]            False Boolean        
    SortedList         False Boolean             False Boolean        
    Stack                 {} Object[]            False Boolean        
    Dictionary         False Boolean             False Boolean        
    List                  {} Object[]            False Boolean        
    Null                True Boolean              True Boolean        
    boolean            False Boolean             False Boolean        
    int32              False Boolean             False Boolean        
    char               False Boolean             False Boolean        
    
    ('string',     ('')),
    ('ArrayList',  (New-Object System.Collections.ArrayList)),
    ('Hashtable',  (New-Object System.Collections.Hashtable)),
    ('Queue',      (New-Object System.Collections.Queue)),
    ('SortedList', (New-Object System.Collections.SortedList)),
    ('Stack',      (New-Object System.Collections.Stack)),
    ('Dictionary', (New-Object "System.Collections.Generic.Dictionary``2[System.String,int32]")),
    ('List',       (New-Object System.Collections.Generic.List``1[int32])),
    ('Null',       ($null)),
    ('boolean',    ($false)),
    ('int32',      ([int32]0)),
    ('char',       ([char]"`0")) |
        % {
            New-Object PSObject -Property @{ 
                CollectionType   =  $_[0]
                x_eq_Null        =  $_[1] -eq $null
                coll_LHS_result  = ($_[1] -eq $null).GetType().Name
                Null_eq_x        =  $null -eq $_[1]
                coll_RHS_result  = ($null -eq $_[1]).GetType().Name
            }
        } |
        select CollectionType,x_eq_Null,coll_LHS_result,Null_eq_x,coll_RHS_result |
        ft -AutoSize