Diferença do PowerShell entre Write-Host e Write-Output?

94

Qual é a diferença entre Write-Host e Write-Output no PowerShell?

Gostar...

Write-Host "Hello World ";

Write-Output "Hello World";
daniyalahmad
fonte

Respostas:

83

Em suma, Write-Hostgrava no próprio console. Pense nisso como um MsgBox em VBScript . Write-Output, por outro lado, grava no pipeline, para que o próximo comando possa aceitá-lo como sua entrada. Você não é obrigado a usar Write-Outputpara escrever objetos, como Write-Outputé implicitamente chamado para você.

PS> Get-Service

seria o mesmo que:

PS> Get-Service | Write-Output
Shay Levy
fonte
16
Powershell é tão confuso desse jeito. Vale a pena ler este link para ter uma ideia do pipline mencionado no PowerShell e como os valores são retornados de uma função. "A palavra-chave return no PowerShell é enganosa - honestamente, eu a evito, porque ela não funciona como a maioria das linguagens de programação." - powershell.org/forums/topic/…
Jim Aho
1
Se você estiver chamando uma função que tem um valor de retorno, NÃO use Write-Output nessa função ou a string será retornada em vez de seu valor de retorno. O que pode causar todo tipo de confusão.
Brain2000
29

Write-Output envia a saída para o pipeline. De lá, ele pode ser canalizado para outro cmdlet ou atribuído a uma variável. O Write-Host o envia diretamente para o console.

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

Get-Variable a,b

Saídas:

Testing Write-Host

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

Se você não disser ao Powershell o que fazer com a saída do pipeline atribuindo-a a uma variável ou canalizando-a para outro comando, ela será enviada para o padrão externo, que normalmente é o console, então o resultado final parece o mesmo .

mjolinor
fonte
9

Write-Outputenvia os dados como um objeto por meio do pipeline. No exemplo de perguntas, ele apenas passará uma string.

write-hosté dependente do host. No console write-hostestá essencialmente fazendo [console]::WriteLine. Veja isso para mais informações.

Chad Carisch
fonte
4
Só para esclarecer para futuros leitores. Write-Ouputenvia objetos. Desta vez era uma string, mas em geral enviará objetos, e normalmente não é necessário usar, pois é a forma padrão de resultados / dados de saída :)
Frode F.
5

Outra diferença entre Write-Host e Write-Output:

  • Write-Host exibe a mensagem na tela, mas não a grava no log

  • Write-Output escreve uma mensagem no log, mas não a exibe na tela.

E o Write-Host é considerado prejudicial. Você pode ver uma explicação detalhada em Write-Host Considered Harmful .

verão
fonte
2
Acho Write-Output muito mais prejudicial. Como você está garantindo que uma função realmente retorne o resultado esperado e não alguma saída inesperada de lixo de um comando?
MKesper
6
Acho que Write-Outputexibe a mensagem na tela, se você estiver executando o script sozinho. Portanto, não tenho certeza do que você quer dizer com "Write-Output grava uma mensagem no log, mas não a exibe na tela." ?
Jim Aho
Você não pode fazer com que Write-Output retorne informações para a tela se for usado dentro de uma função da qual você captura a saída para uma variável. Pode até arruinar a produção. O Write-Host é mais adequado para isso.
galmok
@Summer Write-Output é prejudicial, Write-Information é fantástico. Write-Output é o inimigo das funções Powershell que têm valores de retorno.
Brain2000,
De acordo com os documentos , "A partir do Windows PowerShell 5.0, Write-Host é um wrapper para Write-Information. Isso permite que você use Write-Host para emitir saída para o fluxo de informações."
Phistrom de
0

Você pode entender a diferença entre os dois cmds com o exemplo abaixo:

Host de gravação "msgtxt" | Get-Service Na execução acima, você receberá a saída como "msgtxt"

Saída de gravação "msgtxt" | Get-Service Na execução acima, você receberá um erro, pois msgtxt não é o nome de nenhum serviço. (Em condições ideais) (já que você está gravando em um pipeline e está sendo passado como entrada para Get-Service)

LAKSHAY ARORA
fonte