Différence PowerShell entre Write-Host et Write-Output?

Réponses:

82

En un mot, Write-Hostécrit sur la console elle-même. Considérez-le comme une MsgBox dans VBScript . Write-Output, d'autre part, écrit dans le pipeline, de sorte que la commande suivante peut l'accepter comme entrée. Vous n'êtes pas obligé d'utiliser Write-Outputpour écrire des objets, comme cela Write-Outputest implicitement appelé pour vous.

PS> Get-Service

serait le même que:

PS> Get-Service | Write-Output
Shay Levy
la source
16
Powershell est tellement déroutant de cette façon. Il vaut la peine de lire ce lien pour avoir une idée de la pipline mentionnée dans PowerShell et comment les valeurs sont renvoyées par une fonction. "Le mot-clé return dans PowerShell est trompeur - honnêtement, je l'évite, car il ne fonctionne pas du tout comme la plupart des langages de programmation." - powershell.org/forums/topic/…
Jim Aho
1
Si vous appelez une fonction qui a une valeur de retour, n'utilisez PAS Write-Output dans cette fonction ou cette chaîne sera renvoyée à la place de votre valeur de retour. Ce qui peut causer toutes sortes de ravages.
Brain2000 du
28

Write-Output envoie la sortie au pipeline. À partir de là, il peut être redirigé vers une autre applet de commande ou affecté à une variable. Write-Host l'envoie directement à la console.

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

Get-Variable a,b

Les sorties:

Testing Write-Host

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

Si vous ne dites pas à Powershell quoi faire avec la sortie vers le pipeline en l'attribuant à une variable ou en la redirigeant vers une autre commande, elle est envoyée à out-default, qui est normalement la console, de sorte que le résultat final semble le même .

mjolinor
la source
9

Write-Outputenvoie les données en tant qu'objet via le pipeline. Dans l'exemple Questions, il ne passera qu'une chaîne.

write-hostdépend de l'hôte. Dans la console write-hostfait essentiellement [console]::WriteLine. Voir ceci pour plus d'informations.

Chad Carisch
la source
4
Juste pour clarifier pour les futurs lecteurs. Write-Ouputenvoie des objets. Cette fois, c'était une chaîne, mais en général, elle enverra des objets, et il est normalement inutile d'utiliser car c'est le moyen par défaut de sortir les résultats / données :)
Frode F.
5

Une autre différence entre Write-Host et Write-Output:

  • Write-Host affiche le message à l'écran, mais il ne l'écrit pas dans le journal

  • Write-Output écrit un message dans le journal, mais ne l'affiche pas à l'écran.

Et Write-Host est considéré comme dangereux. Vous pouvez voir une explication détaillée dans l' hôte d'écriture considéré comme nocif .

Été
la source
2
Je trouve Write-Output beaucoup plus nuisible. Comment vous assurez-vous qu'une fonction renvoie réellement le résultat attendu et non une sortie de déchets inattendue d'une commande?
MKesper
6
Je pense que Write-Outputle message s'affiche à l'écran, si vous exécutez le script par vous-même. Donc je ne suis pas sûr de ce que vous voulez dire avec "Write-Output écrit un message dans le journal, mais il ne l'affiche pas à l'écran." ?
Jim Aho
Vous ne pouvez pas faire en sorte que les informations Write-Output retournent à l'écran si elles sont utilisées dans une fonction à partir de laquelle vous capturez la sortie vers une variable. Cela peut même ruiner la sortie. Write-Host est mieux adapté pour cela.
galmok
@Summer Write-Output est nuisible, Write-Information est fantastique. Write-Output est l'ennemi des fonctions Powershell qui ont des valeurs de retour.
Brain2000
Selon la documentation , «À partir de Windows PowerShell 5.0, Write-Host est un wrapper pour Write-Information Cela vous permet d'utiliser Write-Host pour émettre une sortie vers le flux d'informations».
Phistrom
0

Vous pouvez comprendre la différence entre les deux cmds avec l'exemple ci-dessous:

Hôte d'écriture "msgtxt" | Get-Service Lors de l'exécution ci-dessus, vous obtiendrez la sortie en tant que "msgtxt"

Sortie d'écriture "msgtxt" | Get-Service Lors de l'exécution ci-dessus, vous recevrez une erreur car msgtxt n'est le nom d'aucun service. (Dans des conditions idéales) (puisque vous l'écrivez dans un pipeline et qu'il est passé comme entrée à Get-Service)

LAKSHAY ARORA
la source