Meilleur moyen d'écrire sur la console dans PowerShell

142

J'ai un peu de confusion sur les différentes façons d'imprimer (écho) sur la console. J'ai vu qu'il existe plusieurs façons d'écrire la sortie sur la console, telles que:

Write-Host "Hello world1"
"Hello World2"
Out-Host -InputObject "Hello World3"

Les trois méthodes seront imprimées sur la console. Celui du milieu est en quelque sorte plus simple et moins verbeux et plus facile à utiliser. Je trouve également que lorsque vous écrivez une fonction telle que:

function GetValues()
{
    "1"
    "2"
}

Il renvoie toujours deux chaînes dans le pipeline:

Et je suis toujours en mesure d'imprimer les valeurs:

foreach ($s in GetValues)
{
    Write-Host "s: " $s
}

Ce que j'ai trouvé, c'est que l'utilisation de la seule chaîne citée n'apparaît pas toujours sur les hôtes personnalisés et que j'ai dû utiliser Write-Host pour obtenir des valeurs à imprimer sur des hôtes personnalisés.

D'une manière ou d'une autre, je trouve cela déroutant. Est "Print something"censé être un alias Write-Hostou quelle est l'intention?

André
la source

Réponses:

101

Le comportement par défaut de PowerShell consiste simplement à vider tout ce qui sort d'un pipeline sans être capté par un autre élément de pipeline ou assigné à une variable (ou redirigé) dans Out-Host. Ce que Out-Hostfait dépend évidemment de l'hôte.

Le simple fait de laisser les choses tomber du pipeline n'est pas un substitut Write-Hostqui existe pour la seule raison de sortir du texte dans l'application hôte.

Si vous voulez une sortie, utilisez les Write-*applets de commande. Si vous souhaitez renvoyer les valeurs d'une fonction, videz simplement les objets sans applet de commande.

Joey
la source
1
Je l'ai tapé dans le script .vbs. Juste cette ligne de code et ça me lance une erreur.
FrenkyB
58

Celui du milieu écrit dans le pipeline. Write-Hostet Out-Hostécrit sur la console. 'echo' est un alias pour Write-Outputlequel écrit également dans le pipeline. La meilleure façon d'écrire sur la console serait d'utiliser l' Write-Hostapplet de commande.

Lorsqu'un objet est écrit dans le pipeline, il peut être consommé par d'autres commandes de la chaîne. Par exemple:

"hello world" | Do-Something

mais cela ne fonctionnera pas car Write-Hostécrit dans la console, pas dans le pipeline (Do-Something n'obtiendra pas la chaîne):

Write-Host "hello world" | Do-Something
Shay Levy
la source
3
Cette réponse est techniquement correcte, mais je soupçonne qu'elle induit un utilisateur néophyte de PowerShell en erreur. La première règle d'un PowerShell efficace consiste à produire une sortie utile dans le pipeline. Si vous utilisez beaucoup Write-Host, vous le faites probablement mal.
OldFart
6
Eh bien, n'est-ce pas ce que l'OP a demandé, comment écrire sur la console? Il y a une différence entre l'écriture sur l'hôte et l'écriture dans le pipeline, et il faut savoir ce que chacun fait. Je mettrai à jour ma réponse avec une clarification.
Shay Levy