ChatGPT解决这个技术问题 Extra ChatGPT

PowerShell difference between Write-Host and Write-Output?

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

Like...

Write-Host "Hello World";

Write-Output "Hello World";

P
Peter Mortensen

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

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.
m
mjolinor

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.


k
kame

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.


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 :)
P
Peter Mortensen

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.


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.
@Summer Write-Output is harmful, Write-Information is fantastic. Write-Output is the enemy of Powershell functions that have return values.
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."
G
Greg

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)