201

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

Like...

Write-Host "Hello World";

Write-Output "Hello World";

6 Answers 6

172

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
Sign up to request clarification or add additional context in comments.

2 Comments

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.
Be aware, that Write-Output does NOT support colorizing Text like -BackgroundColor DarkGreen -ForegroundColor White
68

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.

Comments

20

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.

2 Comments

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 :)
Since PowerShell 5.0, Write-Host no longer writes directly to the console. Instead, it writes to the new information stream, which may end up in the console, if not redirected (e.g. Write-Host 'foo' 6>&1 | Set-Content file.txt).
10

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.

8 Comments

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?
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." ?
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.
According to the docs, "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."
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.
|
6

One more thing about Write-Host vs Write-Output: inline String concatenation may not work as expected.

$sampleText = "World"    
Write-Host "Hello" $sampleText

returns

Hello World

but

$sampleText = "World"    
Write-Output "Hello" $sampleText

returns

Hello
World

This would encourage Write-Output with a variable (and use of concatenation) holding the entire string at once.

$hw = "Hello " + $sampleText
Write-Output $hw

1 Comment

Neither of the first two snippets are (explicitly) concatenating strings, though. In both cases the cmdlet is being passed two separate parameters, but the difference is in what they do with them: Write-Host without -NoNewLine must write one line of output and so ends up appending its inputs, whereas Write-Output just outputs its two input objects, which are naturally rendered on separate lines. You don't need a separate variable to combine the two strings, though, you just need to pass them as one parameter: Write-Output ("Hello " + $sampleText) or Write-Output "Hello $sampleText".
2

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)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.