Der beste Weg, um in PowerShell auf die Konsole zu schreiben

142

Ich habe ein wenig Verwirrung über die verschiedenen Möglichkeiten, auf der Konsole zu drucken (Echo). Ich habe gesehen, dass es mehrere Möglichkeiten gibt, Ausgaben auf die Konsole zu schreiben, wie zum Beispiel:

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

Alle drei Möglichkeiten werden auf der Konsole gedruckt. Die mittlere ist irgendwie einfacher und weniger ausführlich und einfacher zu bedienen. Ich finde das auch, wenn Sie eine Funktion schreiben wie:

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

Es werden immer noch zwei Zeichenfolgen in der Pipeline zurückgegeben:

Und ich kann die Werte immer noch ausdrucken:

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

Ich habe festgestellt, dass die Verwendung nur der angegebenen Zeichenfolge nicht immer auf benutzerdefinierten Hosts angezeigt wird und dass ich Write-Host verwenden musste , um Werte zum Drucken auf benutzerdefinierten Hosts zu erhalten.

Irgendwie finde ich das verwirrend. Soll "Print something"ein Alias ​​sein Write-Hostoder was ist die Absicht?

Andre
quelle

Antworten:

101

Das Standardverhalten von PowerShell besteht darin, alles, was aus einer Pipeline herausfällt, zu sichern, ohne von einem anderen Pipeline-Element aufgenommen oder einer Variablen zugewiesen (oder umgeleitet) zu werden Out-Host. Was Out-Hosttut, ist offensichtlich hostabhängig.

Nur Dinge aus der Pipeline fallen zu lassen, ist kein Ersatz dafür, Write-Hostder nur aus dem Grund für die Ausgabe von Text in der Host-Anwendung existiert.

Wenn Sie eine Ausgabe wünschen, verwenden Sie die Write-*Cmdlets. Wenn Sie Werte von einer Funktion zurückgeben möchten, geben Sie die Objekte dort einfach ohne Cmdlet aus.

Joey
quelle
1
Ich habe das in .vbs-Skript eingegeben. Nur diese Codezeile und es wirft mir Fehler.
FrenkyB
58

Der mittlere schreibt in die Pipeline. Write-Hostund Out-Hostschreibt an die Konsole. 'echo' ist ein Alias, für Write-Outputden auch in die Pipeline geschrieben wird. Der beste Weg, um auf die Konsole zu schreiben, wäre das Write-HostCmdlet.

Wenn ein Objekt in die Pipeline geschrieben wird, kann es von anderen Befehlen in der Kette verwendet werden. Beispielsweise:

"hello world" | Do-Something

Dies funktioniert jedoch nicht, da Write-Hostin die Konsole und nicht in die Pipeline geschrieben wird (Do-Something erhält den String nicht):

Write-Host "hello world" | Do-Something
Shay Levy
quelle
3
Diese Antwort ist technisch korrekt, aber ich vermute, dass sie einen PowerShell-Neuling in die Irre führt. Die erste Regel für eine effektive PowerShell besteht darin, eine Ausgabe zu erstellen, die in der Pipeline nützlich ist. Wenn Sie Write-Host sehr häufig verwenden, machen Sie es wahrscheinlich falsch.
OldFart
6
Ist es nicht das, was das OP gefragt hat, wie man auf die Konsole schreibt? Es gibt einen Unterschied zwischen dem Schreiben an den Host und dem Schreiben an die Pipeline, und man muss wissen, was jeder tut. Ich werde meine Antwort mit einer Klarstellung aktualisieren.
Shay Levy