Was ist der Unterschied zwischen "Write-Host" "Write-Output", oder "[console]::WriteLine"?
Gibt es eine Reihe von verschiedenen Möglichkeiten, um Meldungen auszugeben. Was ist der effektive Unterschied zwischen der Ausgabe etwas über Write-Host
, Write-Output
oder [console]::WriteLine
?
Ich auch feststellen, dass wenn ich:
write-host "count=" + $count
Den +
wird in die Ausgabe aufgenommen. Warum? Sollte das nicht der Ausdruck, der ausgewertet werden, um zu produzieren, eine einzige verkettete Zeichenfolge bevor es richtig geschrieben?
Write-Output
wenn man emitting Ergebnisse.Write-Host
wenn Sie ausstrahlen von logging-Informationen. Verwenden Sie niemals[console]::writeline()
.- warum sollten wir nie verwenden Sie [console]::writeline() ?
- Denn Sie haben Write-Host.... Ok, ich habe unter einigen Eindruck, es zeigte eine neue Konsole-Fenster (es war ziemlich lange her). Dass das nicht passiert, aber die Tatsache bleibt, dass es nicht die powershell-idiom, und es gibt nichts, was Sie tun können, mit
[console]::writeline("hello world")
dass Sie nicht tun können, mitWrite-Host "hello world"
. Ein anderes, besseres, mehr vor kurzem die zutreffende Antwort ist, dasswrite-host
wrapswrite-information
so seine Daten bekommt, setzen auf einen stream wiewrite-error
so können Sie erfassen und verwenden Sie es woanders.[console]::writeline()
macht das nicht
Du musst angemeldet sein, um einen Kommentar abzugeben.
Write-Output
sollte verwendet werden, wenn Sie möchten, senden von Daten in der pipe-line, aber nicht unbedingt wollen, um anzeigen auf dem Bildschirm. Die pipeline wird schließlich schreiben Sie es aufout-default
wenn nichts anderes verwendet es ersten.Write-Host
sollte verwendet werden, wenn Sie wollen, um das Gegenteil zu tun.[console]::WriteLine
ist im wesentlichen, wasWrite-Host
hinter die kulissen.Ausführen dieser Demo-code und überprüfen Sie das Ergebnis.
Müssen Sie umschließen die verkettungsoperation in Klammern, so dass die PowerShell-Prozesse auf die Verkettung vor der tokenisierung der Liste der parameter für
Write-Host
.BTW - Sehen Sie dieses video von Jeffrey Snover erklärt, wie die pipeline funktioniert. Damals, als ich angefangen zu lernen PowerShell-ich fand, dass dies die nützlichste Erklärung, wie die pipeline funktioniert.
Write-Output
ist die Standardeinstellung, wenn Sie z.B. ein PsObject und Sie einfach spit it out auf dem Bildschirm, indem Sie diese$object
es tatsächlich tun die gleiche Sache wie dieseWrite-Output $object
. Vielleicht erwähnenswertWrite-Output
wenn möglich. Siehe github.com/PoshCode/PowerShellPracticeAndStyle/issues/... > mittels return nur auf die Beendigung der Ausführung. > Vermeiden Sie die Write-Output (...). Stattdessen, wenn Sie möchten, um die Ausgabe übersichtlicher, weisen Sie einfach die Ausgabe auf eine einschlägig benannte variable. und legte, dass eine variable in einer Zeile allein, um zu signalisieren expliziten output. > Write-Output -NoEnumerate ist gebrochen PowerShell-6 und wurde für 16 Monate oder länger. -- es gibt keinen plan, um es zu beheben. In der Zusammenfassung: > VERWENDEN Sie KEINE Write-Output -- IMMER.Abgesehen von dem, was Andy erwähnt, es gibt einen weiteren Unterschied, die wichtig sein könnten - " write-host direkt schreibt, um die host-und nichts zurückgeben, was bedeutet, dass Sie können nicht leiten Sie die Ausgabe z.B. in eine Datei.
Nun führen Sie in der PowerShell:
Gesehen, können Sie nicht umleiten in eine Datei. Dies vielleicht verwunderlich für jemanden, der nicht vorsichtig ist.
Aber wenn eingeschaltet, um die Verwendung von write-output statt, erhalten Sie die Umleitung funktioniert wie erwartet.
Hier ist ein weiterer Weg, um zu erreichen das äquivalent von Write-Output. Setzen Sie einfach die Zeichenfolge in Anführungszeichen:
Können Sie sicherstellen, dass dieser funktioniert genauso wie das Schreiben-Ausgabe durch die Ausführung dieses experiment:
Den ersten beiden Ausgaben "bla bla" zu out.txt aber die Dritte nicht.
"help Write-Output" gibt einen Hinweis auf dieses Verhalten:
In diesem Fall, die Zeichenkette "count=$count" ist das Objekt am Ende der Rohrleitung, und wird angezeigt.
Von meinen Tests Schreiben-Ausgang und [Console]::WriteLine() ausführen, viel besser als Write-Host.
Je nachdem, wie viel text Sie brauchen, um zu schreiben, das kann wichtig sein.
Unten, wenn das Ergebnis von 5 tests jedes für Write-Host, Write-Output und [Console]::WriteLine().
In meiner begrenzten Erfahrung, die ich gefunden habe, bei der Arbeit mit jeder Art von Daten aus der realen Welt muss ich aufgeben, die cmdlets und gehen geradeaus in den unteren level-Befehle, um jede anständige Leistung aus meinen Skripten.
Write-Output
undWrite-Host
dienen verschiedenen Zwecken, so gibt es keinen Punkt in den Vergleich Ihrer Leistung. Ja, die direkte Nutzung .NET-Typen und deren Methoden ist schneller, aber Sie verpassen auf der higher-level-Funktionen, die PowerShell-cmdlets bieten kann.[Console]::WriteLine()
ist ähnlichWrite-Host
in dem Fall bei der hand, aber nicht in allen Fällen, da nicht alle PowerShell-hosts sind Konsolen.Für die Verwendungen von
Write-Host
,PSScriptAnalyzer
ergibt sich die folgende Diagnose:Sehen die Dokumentation hinter dieser Regel für mehr Informationen. Auszüge für die Nachwelt:
Jeffrey Snover hat ein blog-post Write-Host Als Schädlich, in dem er behauptet Write-Host ist fast immer die falsche Sache zu tun, weil es stört automation und bietet mehr Erklärung hinter der Diagnose, aber das oben ist eine gute Zusammenfassung.
Bezug auf [Console]::WriteLine() - Sie sollten es verwenden, wenn Sie gehen, um Rohrleitungen in der CMD (nicht in powershell). Sagen Sie, dass Sie möchten, dass Ihre ps1 streamen eine Menge an Daten auf stdout, und einige andere Dienstprogramm zu verbrauchen/umwandeln. Wenn Sie Write-Host im Skript wird es viel langsamer.