Il existe plusieurs manières de sortir des messages. Quelle est la différence réelle entre la sortie quelque chose par l' intermédiaire Write-Host
, Write-Output
ou [console]::WriteLine
?
Je remarque également que si j'utilise:
write-host "count=" + $count
Le +
est inclus dans la sortie. Pourquoi ça? L'expression ne devrait-elle pas être évaluée pour produire une seule chaîne concaténée avant d'être écrite?
powershell
Scott Langham
la source
la source
Write-Output
lorsque vous émettez des résultats.Write-Host
lorsque vous émettez des informations de journalisation. N'utilisez jamais[console]::writeline()
.[console]::writeline("hello world")
que vous ne puissiez pas faireWrite-Host "hello world"
. Une autre réponse, meilleure et plus récemment applicable, est qu'ellewrite-host
s'enroulewrite-information
pour que ses données soient placées dans un flux, commewrite-error
vous pouvez le capturer et l'utiliser ailleurs.[console]::writeline()
ne fait pas çaRéponses:
Write-Output
doit être utilisé lorsque vous souhaitez envoyer des données dans la canalisation, mais que vous ne souhaitez pas nécessairement les afficher à l'écran. Le pipeline finira par l'écrireout-default
si rien d'autre ne l'utilise en premier.Write-Host
doit être utilisé lorsque vous souhaitez faire le contraire.[console]::WriteLine
est essentiellement ce quiWrite-Host
se fait dans les coulisses.Exécutez ce code de démonstration et examinez le résultat.
Vous devrez mettre l'opération de concaténation entre parenthèses, afin que PowerShell traite la concaténation avant de tokeniser la liste de paramètres pour
Write-Host
, ou d'utiliser l'interpolation de chaîneBTW - Regardez cette vidéo de Jeffrey Snover expliquant le fonctionnement du pipeline. À l'époque où j'ai commencé à apprendre PowerShell, j'ai trouvé que c'était l'explication la plus utile du fonctionnement du pipeline.
la source
Write-Output
c'est la valeur par défaut, par exemple si vous avez un PsObject et que vous le crachez simplement à l'écran en faisant cela,$object
il fera en fait la même chose que celaWrite-Output $object
. Il vaut peut-être la peine de mentionnerWrite-Output
lorsque c'est possible. Voir github.com/PoshCode/PowerShellPracticeAndStyle/issues/... > Utilisez return uniquement pour terminer l'exécution. > Évitez l'écriture-sortie (...). Au lieu de cela, lorsque vous souhaitez rendre la sortie plus claire, affectez simplement la sortie à une variable nommée de manière appropriée. et placez cette variable sur une ligne seule pour signaler une sortie explicite. > Write-Output -NoEnumerate est interrompu sur PowerShell 6 et ce depuis 16 mois ou plus - il n'est pas prévu de le réparer. En résumé:> N'UTILISEZ JAMAIS d'écriture-sortie.En dehors de ce qu'Andy a mentionné, il y a une autre différence qui pourrait être importante - write-host écrit directement sur l'hôte et ne renvoie rien, ce qui signifie que vous ne pouvez pas rediriger la sortie, par exemple, vers un fichier.
Maintenant, exécutez dans PowerShell:
Comme on le voit, vous ne pouvez pas les rediriger dans un fichier. Cela peut être surprenant pour quelqu'un qui ne fait pas attention.
Mais si vous utilisez plutôt la sortie d'écriture, la redirection fonctionnera comme prévu.
la source
Voici une autre façon d'accomplir l'équivalent de Write-Output. Mettez simplement votre chaîne entre guillemets:
Vous pouvez vous assurer que cela fonctionne de la même manière que Write-Output en exécutant cette expérience:
Les deux premiers afficheront "bla bla" vers out.txt, mais le troisième ne le sera pas.
"help Write-Output" donne un indice de ce comportement:
Dans ce cas, la chaîne elle-même "count = $ count" est l'objet à la fin d'un pipeline et est affichée.
la source
Pour les utilisations de
Write-Host
,PSScriptAnalyzer
produit le diagnostic suivant:Consultez la documentation derrière cette règle pour plus d'informations. Extraits pour la postérité:
Jeffrey Snover a un article de blog Write-Host considéré comme nocif dans lequel il affirme que Write-Host est presque toujours la mauvaise chose à faire car il interfère avec l'automatisation et fournit plus d'explications derrière le diagnostic, mais ce qui précède est un bon résumé.
la source
D'après mes tests, Write-Output et [Console] :: WriteLine () fonctionnent bien mieux que Write-Host.
En fonction de la quantité de texte à rédiger, cela peut être important.
Ci-dessous si le résultat de 5 tests chacun pour Write-Host, Write-Output et [Console] :: WriteLine ().
Dans mon expérience limitée, j'ai constaté que lorsque je travaillais avec n'importe quel type de données du monde réel, j'avais besoin d'abandonner les applets de commande et de passer directement aux commandes de niveau inférieur pour obtenir des performances décentes de mes scripts.
la source
Write-Output
etWrite-Host
servent à des fins différentes, il est donc inutile de comparer leurs performances. Oui, l'utilisation directe des types .NET et de leurs méthodes est plus rapide, mais vous manquez les fonctionnalités de niveau supérieur que les applets de commande PowerShell peuvent fournir.[Console]::WriteLine()
est similaire auWrite-Host
cas présent, mais ne fonctionnera pas dans toutes les circonstances, car tous les hôtes PowerShell ne sont pas des consoles .Concernant [Console] :: WriteLine () - vous devriez l'utiliser si vous allez utiliser des pipelines dans CMD (pas dans PowerShell). Supposons que vous souhaitiez que votre ps1 diffuse beaucoup de données sur stdout et un autre utilitaire pour les consommer / les transformer. Si vous utilisez Write-Host dans le script, ce sera beaucoup plus lent.
la source