Es gibt verschiedene Möglichkeiten, Nachrichten auszugeben. Was ist die effektive Differenz etwas über zwischen ausgeben Write-Host
, Write-Output
oder [console]::WriteLine
?
Ich bemerke auch, dass wenn ich benutze:
write-host "count=" + $count
Das +
wird in die Ausgabe aufgenommen. Warum ist das? Sollte der Ausdruck nicht ausgewertet werden, um eine einzelne verkettete Zeichenfolge zu erzeugen, bevor er ausgeschrieben wird?
powershell
Scott Langham
quelle
quelle
Write-Output
wenn Sie Ergebnisse ausgeben.Write-Host
wenn Sie Protokollinformationen ausgeben. Niemals benutzen[console]::writeline()
.[console]::writeline("hello world")
dem Sie nichts anfangen könnenWrite-Host "hello world"
. Eine andere, bessere und in jüngerer Zeit zutreffende Antwort ist, dasswrite-host
Wrapswrite-information
so verwendet werden, dass ihre Daten in einen Stream gestellt werden,write-error
damit Sie sie erfassen und an anderer Stelle verwenden können.[console]::writeline()
macht das nichtAntworten:
Write-Output
sollte verwendet werden, wenn Sie Daten in der Rohrleitung senden möchten, diese aber nicht unbedingt auf dem Bildschirm anzeigen möchten. Die Pipeline schreibt es schließlich,out-default
wenn nichts anderes es zuerst verwendet.Write-Host
sollte verwendet werden, wenn Sie das Gegenteil tun möchten.[console]::WriteLine
ist im Wesentlichen das, wasWrite-Host
hinter den Kulissen geschieht.Führen Sie diesen Demonstrationscode aus und überprüfen Sie das Ergebnis.
Sie müssen den Verkettungsvorgang in Klammern setzen, damit PowerShell die Verkettung verarbeitet, bevor Sie die Parameterliste für die Token-
Write-Host
Interpolation tokenisieren oder die Zeichenfolgeninterpolation verwendenÜbrigens - Sehen Sie sich dieses Video von Jeffrey Snover an, in dem erklärt wird, wie die Pipeline funktioniert. Als ich anfing, PowerShell zu lernen, fand ich, dass dies die nützlichste Erklärung für die Funktionsweise der Pipeline ist.
quelle
Write-Output
liege , aber ich glaube, dies ist die Standardeinstellung, z. B. wenn Sie ein PsObject haben und es einfach auf den Bildschirm ausspucken,$object
wird es tatsächlich das Gleiche tunWrite-Output $object
. Könnte erwähnenswert seinWrite-Output
wenn dies möglich ist. Siehe github.com/PoshCode/PowerShellPracticeAndStyle/issues/… > Verwenden Sie return nur, um die Ausführung zu beenden. > Schreibausgabe vermeiden (...). Wenn Sie die Ausgabe klarer gestalten möchten, weisen Sie die Ausgabe stattdessen einer relevanten Variablen zu. und setzen Sie diese Variable in eine Zeile für sich, um eine explizite Ausgabe zu signalisieren. > Write-Output -NoEnumerate ist in PowerShell 6 fehlerhaft und seit 16 Monaten oder länger in Betrieb - es gibt keinen Plan, dies zu beheben. Zusammenfassend:> VERWENDEN SIE KEINE Schreibausgabe - NIEMALS.Abgesehen von dem, was Andy erwähnt hat, gibt es einen weiteren Unterschied, der wichtig sein könnte: Write-Host schreibt direkt auf den Host und gibt nichts zurück, was bedeutet, dass Sie die Ausgabe nicht umleiten können, z. B. in eine Datei.
Führen Sie jetzt PowerShell aus:
Wie zu sehen ist, können Sie sie nicht in eine Datei umleiten. Dies ist vielleicht überraschend für jemanden, der nicht aufpasst.
Wenn Sie jedoch auf Schreibausgabe umstellen, funktioniert die Umleitung wie erwartet.
quelle
Hier ist eine andere Möglichkeit, das Äquivalent von Write-Output zu erreichen. Setzen Sie einfach Ihre Zeichenfolge in Anführungszeichen:
Sie können sicherstellen, dass dies genauso funktioniert wie Write-Output, indem Sie dieses Experiment ausführen:
Die ersten beiden geben "bla bla" an out.txt aus, die dritte nicht.
"help Write-Output" gibt einen Hinweis auf dieses Verhalten:
In diesem Fall ist die Zeichenfolge selbst "count = $ count" das Objekt am Ende einer Pipeline und wird angezeigt.
quelle
Für Verwendungen von
Write-Host
,PSScriptAnalyzer
erzeugt die folgende Diagnose:Weitere Informationen finden Sie in der Dokumentation hinter dieser Regel. Auszüge für die Nachwelt:
Jeffrey Snover hat einen Blog-Beitrag Write-Host als schädlich eingestuft, in dem er behauptet, Write-Host sei fast immer das Falsche, weil er die Automatisierung stört und mehr Erklärungen für die Diagnose liefert. Das Obige ist jedoch eine gute Zusammenfassung.
quelle
Nach meinen Tests haben Write-Output und [Console] :: WriteLine () eine viel bessere Leistung als Write-Host.
Je nachdem, wie viel Text Sie zum Schreiben benötigen, kann dies wichtig sein.
Unten das Ergebnis von jeweils 5 Tests für Write-Host, Write-Output und [Console] :: WriteLine ().
Aufgrund meiner begrenzten Erfahrung habe ich festgestellt, dass ich bei der Arbeit mit Daten aus der realen Welt die Cmdlets verlassen und direkt zu den Befehlen der unteren Ebene wechseln muss, um eine anständige Leistung meiner Skripte zu erzielen.
quelle
Write-Output
undWrite-Host
dienen verschiedenen Zwecken, so dass es keinen Sinn macht, ihre Leistung zu vergleichen. Ja, die direkte Verwendung von .NET-Typen und ihren Methoden ist schneller, aber Sie verpassen die übergeordneten Funktionen, die PowerShell-Cmdlets bieten können.[Console]::WriteLine()
ähneltWrite-Host
dem vorliegenden Fall, funktioniert jedoch nicht unter allen Umständen, da nicht alle PowerShell-Hosts Konsolen sind .In Bezug auf [Console] :: WriteLine () - sollten Sie es verwenden, wenn Sie Pipelines in CMD (nicht in Powershell) verwenden möchten. Angenommen, Ihr ps1 soll viele Daten an stdout streamen und ein anderes Dienstprogramm, um sie zu konsumieren / transformieren. Wenn Sie Write-Host im Skript verwenden, ist es viel langsamer.
quelle