2016-06-29 37 views
1

我有两个阵列$A$B都可能是空的。

$A = $B = @() 

这工作:

$A+$B | Test-Path 

这不起作用:

$A,$B | Test-Path 

,并返回错误:

Test-Path : Cannot bind argument to parameter 'Path' because it is an empty array.

我本来期望两个表达式失败,作为+运营商添加一个空数组到另一个,这意味着结果数组仍然是空的?

查看两种方法的总体类型,表明它们是相同的类型。

PS Y:\> $E = $A+$B 
PS Y:\> $E.getType() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  Object[]         System.Array 

PS Y:\> $F = $A,$B 
PS Y:\> $F.getType() 

IsPublic IsSerial Name          BaseType 
-------- -------- ----          -------- 
True  True  Object[]         System.Array 

那么,为什么$A+$B & $A,$B不同的相互作用与Test-Path

+1

'$ A + $ B'连接两个空数组,创建一个浅空数组。 '$ A,$ B'创建一个包含两个空数组的新数组 –

回答

4

$A+$B | ...连接$A$B将结果数组传递到管道之前。管道然后展开(仍然是空的)阵列,所以你得到$nullTest-Path永远不会被调用。

$A,$B | ...在将它传递到管道中之前,构造一个具有两个嵌套数组的数组。然后管道展开外部阵列并将每个元素(空阵列$A$B)提供给Test-Path,从而导致您观察到的错误。

基本上你在前者中做$A+$B → @(),在后者中做$A,$B → @(@(), @())

相关问题