2016-06-29 8 views
1

2つの配列$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 

なぜTest-Pathと違っ$A+$B & $A,$B相互作用していますか?

+1

'$ A + $ B'は2つの空の配列を連結し、1つの浅い空の配列を作成します。 '$ A、$ B'は2つの空の配列を含む新しい配列を作成します –

答えて

4

$A+$B | ...は、結果の配列をパイプラインに渡す前に$A$Bを連結します。パイプラインは次に(まだ空の)配列を展開します。したがって、$nullTest-Pathは決して呼び出されません。

$A,$B | ...は、パイプラインに渡す前に2つのネストされた配列を持つ配列を作成します。パイプラインは外部配列を展開し、各要素(空の配列$A$B)をTest-Pathに送ります。これにより、エラーが発生します。

基本的には、前者の場合は$A+$B → @()、後者の場合は$A,$B → @(@(), @())です。

関連する問題