2010-01-28 8 views
13

Hola chicos, soy un novato de Powershell y parezco seguir siendo atrapado en comportamientos tan extraños como este. Aquí hay un código de prueba:Llamar a Echo dentro de una función depende de la secuencia de eco para devolver el valor en Powershell

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

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

La ejecución de este script genera esto como resultado: "var: afdsfadsf bla"

¿Por qué la función no sólo devuelve la cadena "bla"?

+1

simplemente supongo, pero parece que STDOUT (es decir, a qué eco se está imprimiendo) y el valor de retorno se están volcando en la misma secuencia. Puede forzarlos a separarse diciendo eco para imprimir en STDERR: echo "afdsfadsf" 1> & 2; – mlathe

Respuesta

20

Primero, las funciones de PowerShell devuelven toda "salida" no capturada. Puede capturar la salida mediante la asignación a una variable y puede pasar por alto la salida mediante la reorientación de $null por ejemplo:

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

Esto haría algo que normalmente una salida como 0 (el índice donde "hi" se ha añadido) pero debido a que redirige a $ nulo, la salida no se tiene en cuenta.

En segundo lugar, echo es solo un alias para "Write-Output" que escribe el objeto correspondiente en la secuencia de salida. return "blah" es simplemente una comodidad que es equivalente a:

Write-Output "blah" 
return 

Por lo que su implementación de la función es equivalente a esto:

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

Si desea "ver" algo de información sobre la consola del host sin que se considere parte de la "salida" de una función a continuación, utilizar Write-Host por ejemplo:

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

también, si usted no tiene parámetros, entonces no necesita el parens al final del nombre de la función de correo. gramo. function EchoReturnTest { return 'blah' }.

+0

tiene sentido, gracias hermano! – spilliton

+0

Posible error tipográfico: ¿No es eco un alias para "escritura-salida"? – zdan

+1

Sí. WriteObject es lo que utilizas cuando escribo un cmdlet en C# donde he estado gastando mi tiempo últimamente. Un poco de deseo de que hubieran mantenido los nombres consistentes. :-) –

Cuestiones relacionadas