PowerShell-Unterschied zwischen Write-Host und Write-Output?

89

Was ist der Unterschied zwischen Write-Host und Write-Output in PowerShell?

Mögen...

Write-Host "Hello World ";

Write-Output "Hello World";
daniyalahmad
quelle

Antworten:

79

Kurz gesagt, Write-Hostschreibt auf die Konsole selbst. Stellen Sie es sich als MsgBox in VBScript vor . Write-Outputschreibt andererseits in die Pipeline, sodass der nächste Befehl sie als Eingabe akzeptieren kann. Sie müssen nicht verwenden Write-Output, um Objekte zu schreiben, wie dies Write-Outputimplizit für Sie erforderlich ist.

PS> Get-Service

wäre das gleiche wie:

PS> Get-Service | Write-Output
Shay Levy
quelle
16
Powershell ist auf diese Weise so verdammt verwirrend. Es lohnt sich, diesen Link zu lesen, um ein Gefühl für die erwähnte Pipline in Powershell zu bekommen und wie Werte von einer Funktion zurückgegeben werden. "Das Schlüsselwort return in PowerShell ist irreführend - ehrlich gesagt vermeide ich es, da es wie die meisten Programmiersprachen überhaupt nicht funktioniert." - Powershell.org/forums/topic/…
Jim Aho
1
Wenn Sie eine Funktion mit einem Rückgabewert aufrufen, verwenden Sie in dieser Funktion NICHT Write-Output. Andernfalls wird die Zeichenfolge anstelle Ihres Rückgabewerts zurückgegeben. Was alle Arten von Chaos verursachen kann.
Brain2000
27

Write-Output sendet die Ausgabe an die Pipeline. Von dort kann es an ein anderes Cmdlet weitergeleitet oder einer Variablen zugewiesen werden. Write-Host sendet es direkt an die Konsole.

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

Get-Variable a,b

Ausgänge:

Testing Write-Host

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

Wenn Sie Powershell nicht mitteilen, was mit der Ausgabe an die Pipeline zu tun ist, indem Sie sie einer Variablen zuweisen oder an einen anderen Befehl weiterleiten, wird sie an den Standardwert gesendet, bei dem es sich normalerweise um die Konsole handelt, sodass das Endergebnis gleich aussieht .

mjolinor
quelle
9

Write-Outputsendet die Daten als Objekt durch die Pipeline. Im Beispiel "Fragen" wird nur eine Zeichenfolge übergeben.

write-hostist hostabhängig. In der Konsole write-hostgeht es im Wesentlichen [console]::WriteLine. Sehen Sie diese für weitere Informationen.

Chad Carisch
quelle
4
Nur zur Verdeutlichung für zukünftige Leser. Write-Ouputsendet Objekte. Diesmal war es eine Zeichenfolge, aber im Allgemeinen sendet sie Objekte und ist normalerweise nicht erforderlich, da dies die Standardmethode für die Ausgabe von Ergebnissen / Daten ist :)
Frode F.
5

Ein weiterer Unterschied zwischen Write-Host und Write-Output:

  • Write-Host zeigt die Nachricht auf dem Bildschirm an, schreibt sie jedoch nicht in das Protokoll

  • Write-Output schreibt eine Nachricht in das Protokoll, zeigt sie jedoch nicht auf dem Bildschirm an.

Und Write-Host wird als schädlich angesehen. Eine ausführliche Erklärung finden Sie unter Write-Host als schädlich eingestuft .

Sommer
quelle
2
Ich finde Write-Output viel schädlicher. Wie stellen Sie sicher, dass eine Funktion tatsächlich Ihr erwartetes Ergebnis zurückgibt und keine unerwartete Müllausgabe eines Befehls?
MKesper
6
Ich denke, Write-Outputdie Meldung wird auf dem Bildschirm angezeigt, wenn Sie das Skript selbst ausführen. Ich bin mir also nicht sicher, was Sie mit "Write-Output schreibt eine Nachricht in das Protokoll, aber sie wird nicht auf dem Bildschirm angezeigt" meinen. ?
Jim Aho
Write-Output kann keine Informationen an den Bildschirm zurückgeben, wenn diese in einer Funktion verwendet werden, von der aus Sie die Ausgabe an eine Variable erfassen. Es kann sogar die Ausgabe ruinieren. Write-Host ist dafür besser geeignet.
Galmok
@Summer Write-Output ist schädlich, Write-Information ist fantastisch. Write-Output ist der Feind von Powershell-Funktionen mit Rückgabewerten.
Brain2000
In den Dokumenten heißt es: "Ab Windows PowerShell 5.0 ist Write-Host ein Wrapper für Write-Information. Auf diese Weise können Sie Write-Host verwenden, um Ausgaben an den Informationsstrom zu senden."
Phistrom