2010-01-28 9 views
13

Hey ragazzi, sono un Powershell noob e sembra che continui a essere preso da piccoli comportamenti strani come questo. Ecco alcuni codice di prova:Chiamare Echo all'interno di una funzione pre-impegna la stringa echo per restituire il valore in PowerShell

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

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

esecuzione di questo script genera questo come output: "var: afdsfadsf blah"

Perché la funzione non solo restituire la stringa "blah"?

+1

solo un'ipotesi, ma sembra STDOUT (ovvero su quale eco sta stampando) e il valore di ritorno viene scaricato nello stesso flusso. Potresti essere in grado di forzarli a separare dicendo a echo di stampare su STDERR: echo "afdsfadsf" 1> & 2; – mlathe

risposta

20

Innanzitutto, le funzioni di PowerShell restituiscono tutte le "copie" non acquisite. È possibile catturare l'uscita assegnando a una variabile e si può ignorare l'uscita reindirizzando a $null esempio:

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

Questo farebbe qualcosa normalmente output come 0 (l'indice dove "hi" è stata aggiunta), ma perché abbiamo reindirizzato a $ null, l'output è ignorato.

Secondo, echo è solo un alias per "Write-Output" che scrive l'oggetto corrispondente nel flusso di output. return "blah" è solo una comodità che è equivalente a:

Write-Output "blah" 
return 

Quindi l'implementazione funzione è equivalente a questo:

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

Se si desidera "vedere" alcune informazioni sulla console host senza che venga considerata parte del "uscita" di una funzione quindi utilizzare Write-Host ad esempio:

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

Inoltre, se si dispone di alcun parametro, allora non ti servono le parentesi alla fine del nome della funzione e. g. function EchoReturnTest { return 'blah' }.

+0

Ha senso, grazie fratello! – spilliton

+0

Possibile errore: non è echo un alias per "write-output"? – zdan

+1

Sì. WriteObject è ciò che si usa quando si scrive un cmdlet in C# in cui ho trascorso il tempo ultimamente. Tipo di desiderio avrebbero mantenuto i nomi coerenti. :-) –