130

What is the difference between Write-Host and Write-Output in PowerShell?

Like...

Write-Host "Hello World";

Write-Output "Hello World";
kame
  • 19,003
  • 30
  • 100
  • 149
daniyalahmad
  • 3,093
  • 8
  • 27
  • 51

5 Answers5

116

In a nutshell, Write-Host writes to the console itself. Think of it as a MsgBox in VBScript. Write-Output, on the other hand, writes to the pipeline, so the next command can accept it as its input. You are not required to use Write-Output in order to write objects, as Write-Output is implicitly called for you.

PS> Get-Service

would be the same as:

PS> Get-Service | Write-Output
Peter Mortensen
  • 30,030
  • 21
  • 100
  • 124
Shay Levy
  • 114,369
  • 30
  • 175
  • 198
  • 6
    If you are calling a function that has a return value, do NOT use Write-Output in that function or that string will be returned instead of your return value. Which can cause all kinds of havoc. – Brain2000 Sep 11 '19 at 02:03
46

Write-Output sends the output to the pipeline. From there it can be piped to another cmdlet or assigned to a variable. Write-Host sends it directly to the console.

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

Get-Variable a,b

Outputs:

Testing Write-Host

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

If you don't tell Powershell what to do with the output to the pipeline by assigning it to a variable or piping it to anoher command, then it gets sent to out-default, which is normally the console so the end result appears the same.

mjolinor
  • 62,812
  • 6
  • 108
  • 130
11

Write-Output sends the data as an object through the pipeline. In the Questions example it will just pass a string.

Write-Host is host dependent. In the console Write-Host is essentially doing [console]::WriteLine. See this for more info.

kame
  • 19,003
  • 30
  • 100
  • 149
Chad Carisch
  • 2,322
  • 3
  • 20
  • 30
  • 5
    Just to clarify for future readers. `Write-Ouput` sends objects. This time it was a string, but in general it will send objects, and is normally unnecessary to use as it is the default way to output results/data :) – Frode F. Nov 03 '13 at 17:20
9

Another difference between Write-Host and Write-Output:

  • Write-Host displays the message on the screen, but it does not write it to the log

  • Write-Output writes a message to the log, but it does not display it on the screen.

And Write-Host is considered as harmful. You can see a detailed explanation in Write-Host Considered Harmful.

Peter Mortensen
  • 30,030
  • 21
  • 100
  • 124
Summer
  • 239
  • 3
  • 3
  • 3
    I find Write-Output much more harmful. How are you making sure a function actually returns your expected result and not some unexpected garbage output from a command? – MKesper Nov 30 '16 at 10:44
  • 8
    I think `Write-Output` displays the message on the screen, if you're running the script by yourself. So i'm not sure what you're meaning with "Write-Output writes a message to the log, but it does not display it on the screen." ? – Jim Aho Aug 30 '18 at 12:14
  • You cannot have Write-Output return information to the screen if it is used inside a function from which you capture output to a variable. It may even ruin the output. Write-Host is better suited for this. – galmok Jul 08 '19 at 14:35
  • @Summer Write-Output is harmful, Write-Information is fantastic. Write-Output is the enemy of Powershell functions that have return values. – Brain2000 Sep 11 '19 at 02:20
  • 1
    [According to the docs](https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/write-information?view=powershell-5.1#description), "Starting in Windows PowerShell 5.0, Write-Host is a wrapper for Write-Information This allows you to use Write-Host to emit output to the information stream." – Phistrom Oct 10 '19 at 18:39
  • All versions of "I just want to output something to the screen thanks, in a sequential order with my script code" are broken in PowerShell. It's a case of "the designers trying to be too fancy/philosophical instead of catering to the needs of users". Users want to output to screen sometimes. PowerShell does not allow, in a rational way, the goal of "I just want to output some text to the screen in my code, sequentially, and maybe colour some of the output to highlight information". This functionality exists in *every* programming language except for PowerShell, where it is a broken mess. – YorSubs Dec 22 '19 at 11:44
0

You can understand the difference between the two cmds with below example:

Write-host "msgtxt" | Get-Service On running above, you will get output as "msgtxt"

Write-output "msgtxt" | Get-Service On running above, you will receive an error since msgtxt is not the name of any service.( In ideal condition) (Since you are writing it to a pipeline and it is being passed as input to Get-Service)

LAKSHAY ARORA
  • 81
  • 1
  • 2