2010-01-28 8 views
13

Hé les gars, je suis un Powershell noob et je continue à me faire prendre par de petits comportements bizarres comme ça. Voici un code de test:Appeler Echo dans une fonction pré-pends une chaîne d'écho pour renvoyer une valeur dans Powershell

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

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

L'exécution de ce script génère cette sortie comme: « var: afdsfadsf bla »

Pourquoi la fonction non seulement retourne la chaîne « bla »?

+1

juste une supposition, mais il ressemble à STDOUT (c'est-à-dire ce que l'écho est l'impression) et la valeur de retour sont déversés dans le même flux. Vous pourriez les forcer à être séparés en disant à echo d'imprimer sur STDERR: echo "afdsfadsf" 1> & 2; – mlathe

Répondre

20

D'abord, les fonctions PowerShell renvoient toutes les "sorties" non capturées. Vous pouvez capturer la sortie en attribuant à une variable et vous pouvez ignorer la sortie par la redirection vers $null par exemple:

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

Ce serait quelque chose normalement sortie comme 0 (l'indice où a été ajouté « salut »), mais parce que nous avons réexpédié à $ null, la sortie est ignorée.

Ensuite, echo est juste un alias pour "Write-Output" qui écrit l'objet correspondant dans le flux de sortie. return "blah" est juste une commodité qui équivaut à:

Write-Output "blah" 
return 

Ainsi, votre implémentation de la fonction est équivalente à ceci:

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

Si vous voulez « voir » quelques informations sur la console hôte sans que cela soit considéré une partie de la « sortie » d'une fonction puis utilisez Write-Host par exemple:

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

aussi, si vous avez pas de paramètres vous n'avez pas besoin des parens à la fin du nom de la fonction e. g. function EchoReturnTest { return 'blah' }.

+0

Semble sens, merci frère! – spilliton

+0

Typo possible: L'écho n'est-il pas un alias pour "write-output"? – zdan

+1

Oui. WriteObject est ce que vous utilisez lorsque vous écrivez une cmdlet en C# où j'ai passé mon temps dernièrement. Genre de souhait ils auraient gardé les noms cohérents. :-) –

Questions connexes