2015-09-13 81 views
2

PowerShell中+,运营商之间的确切区别是什么?例如,当只是试图连接两个阵列都产生相同的输出,但我不能一个,操作,只有+操作的结果的排序结果:了解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 

什么混淆我更是事实,这两个运营商返还相同种类:

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

我有一个怀疑:','的结果被包裹到一个额外的数组中,而'+'的输出不是。 –

回答

4

无论是运营商将产生在方案中的数组,但逗号操作符不进行内插数组,所以你得到数组有数组,而+操作将第二个数组的元素附加到第一个数组的元素。它变得更清晰,当你输出JSON格式的数组:

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

你不能只是胡乱使用+运营商,不过,因为它的负荷过重,会产生依赖于第一操作数的类型不同的结果:

PS C:\>1 + @(3, 4)   # integer addition (fails) 
Method invocation failed because [System.Object[]] does not contain a method 
named 'op_Addition'. 
At line:1 char:7 
+ 1 + @(3, 4) 
+  ~~~~ 
    + CategoryInfo   : InvalidOperation: (op_Addition:String) [], ... 
    + FullyQualifiedErrorId : MethodNotFound 

PS C:\>"1" + @(3, 4)  # string concatenation (succeeds) 
13 4 
PS C:\>@(1) + @(3, 4)  # array append (succeeds) 
1 
3 
4