了解 PowerShell 运算符 + 和 ,

Understanding PowerShell operators + and ,

PowerShell 中的 +, 运算符之间的确切区别是什么?例如,当简单地尝试连接两个数组都产生相同的输出时,但我无法对 , 操作的结果进行排序,只能对 + 操作的结果进行排序:

$a = Get-ChildItem C:\
$b = Get-ChildItem C:\Windows
# Does not sort anything, actually is the same output as $a, $b
$a , $b | sort
# Sort actually works
$a + $b | sort

更让我困惑的是,两个运算符 return 是同一类型:

PS C:\> ($a,$b).getType().Name
Object[]
PS C:\> ($a+$b).getType().Name
Object[]

两个运算符都会在您的场景中生成一个数组,但逗号运算符不会插入数组,因此您会在那里得到一个数组数组,而 + 运算符会附加第二个数组的元素数组到第一个数组的那些。当您以 JSON 格式输出数组时,它会变得更加清晰:

PS C:\> <b>$a = 1, 2</b>
PS C:\> <b>$b = 3, 4</b>
PS C:\> <b>($a, $b) | ConvertTo-Json</b>
[
    {
        "value": [
                      1、
                      2个
                  ],
        "Count": 2
    },
    {
        "value": [
                      3、
                      4个
                  ],
        "Count": 2
    }
]
PS C:\> <b>($a + $b) | ConvertTo-Json</b>
[
    1、
    2、
    3、
    4个
]

不过,您不能不加选择地使用 + 运算符,因为它已过载并且会根据第一个操作数的类型产生不同的结果:

PS C:\> <b>1 + @(3, 4)</b> <i>#整数加法(失败)</i>
方法调用失败,因为 [System.Object[]] 不包含方法
命名为 'op_Addition'。
在 line:1 char:7
+ 1 + @(3, 4)
+ ~~~~
    + CategoryInfo:InvalidOperation:(op_Addition:字符串)[],...
    + FullyQualifiedErrorId : MethodNotFound

PS C:\> <b>"1" + @(3, 4)</b> <i># 字符串连接(成功)</i>
13 4
PS C:\> <b>@(1) + @(3, 4)</b> <i># 数组追加(成功)</i>
1个
3个
4