2010-01-28 2 views
13

Hey Leute, ich bin ein Powershell-Noob und halte mich immer wieder an etwas seltsames Verhalten wie dieses fest. Hier finden Sie einige Testcode:Wenn Echo in einer Funktion aufgerufen wird, wird die Echo-Zeichenfolge in Powershell zurückgegeben, um den Wert zurückzugeben.

function EchoReturnTest(){ 
    echo "afdsfadsf" 
    return "blah" 
} 

$variable = EchoReturnTest 
echo ("var: " + $variable) 

dieses Skript Laufen erzeugt dies als Ausgabe: „var: afdsfadsf blah“

Warum wird die Funktion nicht nur zurückgeben die Zeichenfolge „blah“?

+1

nur eine Vermutung, aber es sieht aus wie STDOUT (dh welches Echo wird gedruckt) und der Rückgabewert werden in den gleichen Strom geworfen. Sie könnten sie in der Lage sein, sie zu trennen, indem Sie das Echo an STDERR ausgeben lassen: echo "afdsfadsf" 1> & 2; – mlathe

Antwort

20

Zunächst geben PowerShell-Funktionen alle nicht erfassten "Ausgaben" zurück. Sie können die Ausgabe erfassen, indem einer Variablen zugewiesen und Sie können $null zB Ausgabe ignorieren, indem Umleitung:

$arrayList.Add("hi") > $null 

Dies würde normalerweise Ausgabe etwas wie 0 (der Index, in dem „hallo“ hinzugefügt wurde), sondern weil wir zu $ ​​umgeleitet Null, die Ausgabe wird ignoriert.

Zweitens ist echo nur ein Alias ​​für "Write-Output", der das entsprechende Objekt in den Ausgabestrom schreibt. return "blah" ist nur eine Bequemlichkeit, die äquivalent ist:

Write-Output "blah" 
return 

So Ihre Funktion Umsetzung dieses entspricht:

function EchoReturnTest(){ 
    Write-Output "afdsfadsf" 
    Write-Output "blah" 
    return 
} 

Wenn Sie einige Informationen über die Host-Konsole zu „sehen“ wollen, ohne es in Betracht gezogen werden Teil des „Ausgangs“ eine Funktion verwenden Sie Write-Host zB:

function EchoReturnTest(){ 
    Write-Host "afdsfadsf" 
    return "blah" 
} 

auch wenn Sie keine Parameter haben, dann müssen Sie nicht über die Pars am Ende des Funktionsnamen e. G. function EchoReturnTest { return 'blah' }.

+0

Macht Sinn, danke, Bruder! – spilliton

+0

Mögliche Tippfehler: Gibt es keinen Alias ​​für "Write-Output"? – zdan

+1

Ja. WriteObject verwenden Sie, wenn Sie ein Cmdlet in C# schreiben, in dem ich in letzter Zeit meine Zeit verbracht habe. Ein bisschen Wunsch hätten sie die Namen konsistent gehalten. :-) –