La mejor manera de escribir en la consola en PowerShell

142

Tengo un poco de confusión sobre las diversas formas de imprimir (eco) en la consola. He visto que hay varias formas de escribir resultados en la consola, como:

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

Las tres formas se imprimirán en la consola. El del medio es de alguna manera más simple y menos detallado y más fácil de usar. También encuentro que cuando escribes una función como:

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

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

Y todavía puedo imprimir los valores:

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

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

De alguna manera encuentro esto confuso. ¿Se "Print something"supone que es un alias Write-Hosto cuál es la intención?

Andre
fuente

Respuestas:

101

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

Simplemente dejar que las cosas se salgan de la tubería no es un sustituto Write-Hostque existe por la única razón de generar texto en la aplicación host.

Si desea resultados, use los Write-*cmdlets. Si desea devolver valores de una función, simplemente voltee los objetos allí sin ningún cmdlet.

Joey
fuente
1
Lo escribí en el script .vbs. Solo esa línea de código y me está arrojando un error.
FrenkyB
58

El del medio escribe en la tubería. Write-Hosty Out-Hostescribe a la consola. 'echo' es un alias para el Write-Outputque también escribe en la tubería. La mejor manera de escribir en la consola sería usar el Write-Hostcmdlet.

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

"hello world" | Do-Something

pero esto no funcionará ya que Write-Hostescribe en la consola, no en la tubería (Do-Something no obtendrá la cadena):

Write-Host "hello world" | Do-Something
Shay Levy
fuente
3
Esta respuesta es técnicamente correcta, pero sospecho que lleva 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 está utilizando Write-Host mucho, probablemente lo esté haciendo mal.
OldFart
66
Bueno, ¿no es eso lo que preguntó el OP, cómo escribir en la consola? Hay una diferencia entre escribir en el host y escribir en la canalización, y uno tiene que saber qué hace cada uno. Actualizaré mi respuesta con una aclaración.
Shay Levy