2016-06-29 72 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 → @(@(), @())

相關問題