2013-08-27 24 views
13

Da zurückkehren, dass dies funktioniert:Powershell nicht ein leeres Array als Array

$ar = @() 
$ar -is [Array] 
    True 

Warum funktioniert das nicht?

function test { 
    $arr = @() 
    return $arr 
} 

$ar = test 
$ar -is [Array] 
    False 

Das ist, warum wird kein leeres Array von der Testfunktion zurückgegeben?

Antwort

17

Ihre Funktion funktioniert nicht, da PowerShell alle non-captured stream output zurückgibt, nicht nur das Argument der return-Anweisung. Ein leeres Array wird dabei in $null zerlegt. Sie können jedoch ein Array auf Rückkehr von prepending it with the array construction operator (,) erhalten:

function test { 
    $arr = @() 
    return ,$arr 
} 
+1

soooooo frustrierend. Wenn Sie @ zurückgeben (/ * einige gefilterte Ausdrücke, die keine Elemente */haben), stoßen Sie auch auf das gleiche Verhalten. return, @ (/ * expr * /) ist ein Fix ... aber es ist hacky wie die Hölle. So leicht zu übersehen. –

+0

Diese dummen Arbeiten kosteten mich ungefähr einen Tag in der verdammten Zeit. Ich konnte nicht herausfinden, wie mein Skript doppelt so groß war wie die Werte im Array. Danke, dass du das geschrieben hast. Warum sollten sie überhaupt denken, dass das eine gute Idee für Funktionen ist? So frustrierend! Der schlimmste Teil ist, ich hatte ein '$ arr.add (1)', das die Zählung des Arrays danach ausgab. Doing '$ x = $ arr.add (1)' behob das Problem. Hacky. –

+0

@BradFJacobs: Sie könnten auch '... | verwenden Out-Null' oder '...> $ null', um eine unerwünschte Ausgabe zu unterdrücken. Ich würde nicht in Betracht ziehen, alle nicht erfaßten Ausgaben per se schlecht zu machen, aber für die meisten Leute mit einem Hintergrund in anderen Programmiersprachen ist das einfach unerwartet. Bei richtiger Verwendung kann es das Zurückgeben von Daten aus einer Funktion vereinfachen, da Sie nicht alle gewünschten Ausgaben in einer Variablen sammeln müssen, bevor Sie sie zurückgeben. –

Verwandte Themen