2016-06-29 8 views
1

Ich habe zwei Arrays $A und $B beide möglicherweise leer sein könnte.

$A = $B = @() 

Dies funktioniert:

$A+$B | Test-Path 

Dies funktioniert nicht:

$A,$B | Test-Path 

und gibt den Fehler:

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

ich beide Ausdrücke erwartet hätte zum Scheitern verurteilt, wie der + Operator ist Hinzufügen eines leeren Array zu einem anderen, was bedeutet, dass das resultierende Array noch leer ist?

Betrachtet man die Gesamttypen beider Methoden, so zeigt sich, dass sie vom selben Typ sind.

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 

Warum tut $A+$B & $A,$B interact anders mit Test-Path?

+1

'$ A + $ B' verknüpft die beiden leeren Arrays zu einem flachen leeren Array. '$ A, $ B' erstellt ein neues Array mit zwei leeren Arrays –

Antwort

4

$A+$B | ... verkettet $A und $B, bevor das resultierende Array an die Pipeline übergeben wird. Die Pipeline entrollt dann das (noch leere) Array, so dass Sie $null erhalten und Test-Path nie aufgerufen wird.

$A,$B | ... erstellt ein Array mit zwei verschachtelten Arrays, bevor es in die Pipeline übergeben wird. Die Pipeline entrollt dann das äußere Array und führt jedes Element (die leeren Arrays $A und $B) zu Test-Path, wodurch der von Ihnen beobachtete Fehler verursacht wird.

Grundsätzlich tun Sie $A+$B → @() in der ehemaligen und $A,$B → @(@(), @()) in letzterem Fall.