¿Diferencia de PowerShell entre Write-Host y Write-Output?

Respuestas:

82

En pocas palabras, Write-Hostescribe en la propia consola. Piense en ello como un MsgBox en VBScript . Write-Output, por otro lado, escribe en la canalización, por lo que el siguiente comando puede aceptarlo como entrada. No es necesario que lo utilice Write-Outputpara escribir objetos, como Write-Outputse le pide implícitamente.

PS> Get-Service

sería lo mismo que:

PS> Get-Service | Write-Output
Shay Levy
fuente
16
Powershell es tan confuso de esta manera. Vale la pena leer este enlace para tener una idea de la pipline mencionada en PowerShell y cómo se devuelven los valores de una función. "La palabra clave return en PowerShell es engañosa; honestamente, la evito porque no funciona en absoluto como la mayoría de los lenguajes de programación". - powershell.org/forums/topic/…
Jim Aho
1
Si está llamando a una función que tiene un valor de retorno, NO use Write-Output en esa función o esa cadena se devolverá en lugar de su valor de retorno. Lo que puede causar todo tipo de estragos.
Brain2000
28

Write-Output envía la salida a la canalización. Desde allí, se puede canalizar a otro cmdlet o asignar a una variable. Write-Host lo envía directamente a la consola.

$a = 'Testing Write-OutPut'  | Write-Output
$b = 'Testing Write-Host' | Write-Host

Get-Variable a,b

Salidas:

Testing Write-Host

Name                           Value                                                                 
----                           -----                                                                 
a                              Testing Write-OutPut                                                  
b                                                  

Si no le dice a Powershell qué hacer con la salida de la canalización asignándola a una variable o canalizándola a otro comando, entonces se envía a la salida predeterminada, que normalmente es la consola, por lo que el resultado final parece el mismo. .

mjolinor
fuente
9

Write-Outputenvía los datos como un objeto a través de la canalización. En el ejemplo de Preguntas, solo pasará una cadena.

write-hostdepende del anfitrión. En la consola write-hostesencialmente está haciendo [console]::WriteLine. Vea esto para más información.

Chad Carisch
fuente
4
Solo para aclarar a los futuros lectores. Write-Ouputenvía objetos. Esta vez fue una cadena, pero en general enviará objetos, y normalmente no es necesario usarla, ya que es la forma predeterminada de generar resultados / datos :)
Frode F.
5

Otra diferencia entre Write-Host y Write-Output:

  • Write-Host muestra el mensaje en la pantalla, pero no lo escribe en el registro

  • Write-Output escribe un mensaje en el registro, pero no lo muestra en la pantalla.

Y Write-Host se considera dañino. Puede ver una explicación detallada en Write-Host Considered Dañino .

Verano
fuente
2
Encuentro Write-Output mucho más dañino. ¿Cómo se asegura de que una función realmente devuelva el resultado esperado y no una salida basura inesperada de un comando?
MKesper
6
Creo que Write-Outputmuestra el mensaje en la pantalla, si está ejecutando el script usted mismo. Así que no estoy seguro de lo que quiere decir con "Write-Output escribe un mensaje en el registro, pero no lo muestra en la pantalla". ?
Jim Aho
No puede tener información de retorno de escritura de salida a la pantalla si se usa dentro de una función desde la cual captura la salida a una variable. Incluso puede arruinar la salida. Write-Host es más adecuado para esto.
galmok
@Summer Write-Output es dañino, Write-Information es fantástico. Write-Output es el enemigo de las funciones de Powershell que tienen valores de retorno.
Brain2000
Según los documentos , "A partir de Windows PowerShell 5.0, Write-Host es un contenedor para Write-Information. Esto le permite usar Write-Host para emitir resultados al flujo de información".
Phistrom
0

Puede comprender la diferencia entre los dos cmds con el siguiente ejemplo:

Host de escritura "msgtxt" | Get-Service Al ejecutar arriba, obtendrá la salida como "msgtxt"

Salida de escritura "msgtxt" | Get-Service Al ejecutar arriba, recibirá un error ya que msgtxt no es el nombre de ningún servicio (en condiciones ideales) (ya que lo está escribiendo en una canalización y se pasa como entrada a Get-Service)

LAKSHAY ARORA
fuente