2012-05-31 25 views
87

Tengo un poco de confusión acerca de las diversas formas de imprimir (eco) en la consola. He visto que hay varias maneras de escribir salida en la consola, tales como:La mejor manera de escribir en la consola en PowerShell

Write-Host "Hello world1" 
"Hello World2" 
Out-Host -InputObject "Hello World3" 

Los tres maneras se imprimirán en la consola. El medio es de alguna manera más simple y menos detallado y más fácil de usar. También me parece que cuando se escribe una función como:

function GetValues() 
{ 
    "1" 
    "2" 
} 

Todavía devuelve dos cadenas en la tubería:

Y sigo siendo capaz de imprimir los valores:

foreach ($s in GetValues) 
{ 
    Write-Host "s: " $s 
} 

Lo que encontré fue que usar solo la cadena entrecomillada no siempre aparece en los hosts personalizados, y que tuve que usar Write-Host para obtener valores para imprimir en hosts personalizados.

De alguna manera esto me parece confuso. ¿Se supone que "Print something" es un alias de Write-Host o cuál es la intención?

+2

[Write-Host es malo ] (http://windowsitpro.com/blog/what-do-not-do-powershell-part-1) –

Respuesta

64

El comportamiento predeterminado de PowerShell es simplemente volcar todo lo que sale de una tubería sin ser recogido por otro elemento de tubería o ser asignado a una variable (o redirigido) al Out-Host. Lo que hace Out-Host es obviamente dependiente del host.

dejar que las cosas caen fuera de la tubería es no un sustituto de Write-Host que existe por la única razón de la salida de texto en la aplicación host.

Si desea salida, utilice los cmdlets Write-*. Si desea devolver valores de una función, simplemente vacíe los objetos allí sin ningún cmdlet.

+0

¿Por qué Write-Host "Hello world" arroja el error 'expected end of statement'? – FrenkyB

+0

No tengo idea. Escribir eso en PowerShell aquí muestra el comportamiento esperado aquí y no da error. – Joey

+1

He escrito eso en el script .vbs. Solo esa línea de código y me está arrojando un error. – FrenkyB

35

El del medio escribe en la tubería. Write-Host y Out-Host escribe en la consola. 'echo' es un alias para Write-Output que también escribe en la canalización. La mejor forma de escribir en la consola sería usando el cmdlet Write-Host.

Cuando un objeto se escribe en la tubería, puede ser consumido por otros comandos en la cadena. Por ejemplo:

"hello world" | Do-Something 

pero esto no va a funcionar desde Write-Host escribe en la consola, no a la tubería (Do-Algo no va a obtener la cadena):

Write-Host "hello world" | Do-Something 
+3

Esta respuesta es técnicamente correcta, pero sospecho que conduce a un usuario neófito de PowerShell por mal camino. La primera regla de PowerShell efectivo es producir resultados que sean útiles en la tubería. Si usa mucho Write-Host, probablemente lo esté haciendo mal. – OldFart

+3

Bueno, ¿no es eso lo que preguntó OP, cómo escribir en la consola? Hay una diferencia entre escribirle al host y escribir en la canalización, y uno tiene que saber lo que cada uno hace. Actualizaré mi respuesta con una aclaración. –

Cuestiones relacionadas