Ich führe ein PowerShell-Skript aus einer Batchdatei aus. Das Skript ruft eine Webseite ab und prüft, ob der Inhalt der Seite die Zeichenfolge "OK" ist.
Das PowerShell-Skript gibt eine Fehlerstufe an das Batch-Skript zurück.
Das Batch-Skript wird von ScriptFTP , einem FTP-Automatisierungsprogramm, ausgeführt. Wenn ein Fehler auftritt, kann ScriptFTP die vollständige Konsolenausgabe per E-Mail an den Administrator senden.
Im PowerShell-Skript möchte ich den Rückgabewert von der Website ausgeben, wenn er nicht "OK" ist, sodass die Fehlermeldung in der Konsolenausgabe und damit in der Statusmail enthalten ist.
Ich bin neu in PowerShell und nicht sicher, welche Ausgabefunktion ich dafür verwenden soll. Ich kann drei sehen:
- Write-Host
- Schreibausgabe
- Schreibfehler
Was wäre das Richtige, um in das Windows-Äquivalent von zu schreiben stdout
?
quelle
"Hello, World!" | Out-Host
.Out-Host
Auf der anderen Seite werden Objekte zur Anzeige an den PowerShell-Host gesendet, und ihre Implementierung hängt vom Host ab. Der Konsolenhost sendet sieOut-Default
tatsächlich an das Standardausgabe-Handle (das auf dem Weg durchläuft ). PowerShell ISE zeigt sie jedoch in seinem Ausgabebereich an, und andere Hosts können möglicherweise noch andere Aufgaben ausführen.Get-ChildItem
Ausgabe beispielsweise in Tabellenform angezeigt, und die Ergebnisse werdenFormat-List
stattdessen mit vielen Eigenschaften (z. B. WMI) verwendet.Ich denke in diesem Fall benötigen Sie Write-Output .
Wenn Sie ein Skript wie haben
Wenn Sie dann das Skript mit umgeleiteter Ausgabe aufrufen
yourscript.ps1 > out.txt
, werden Sie in der "out.txt"test2
auf dem Bildschirmtest1\ntest3\n
angezeigt.Beachten Sie, dass "test3" und die Write-Output-Zeile immer eine neue Zeile an Ihren Text anhängen und es in PowerShell keine Möglichkeit gibt, dies zu stoppen (dies
echo -n
ist in PowerShell mit den nativen Befehlen unmöglich). Wenn Sie (die etwas einfach und leicht in möchten Bash ) Funktionalitätecho -n
dann sehen samthebest Antwort .Wenn in einer Batchdatei ein PowerShell-Befehl ausgeführt wird, wird höchstwahrscheinlich der Befehl Schreiben / Ausgeben erfasst. Ich habe "lange Diskussionen" mit Systemadministratoren darüber geführt, was auf die Konsole geschrieben werden soll und was nicht. Wir haben uns jetzt darauf geeinigt, dass die einzigen Informationen, wenn das Skript erfolgreich ausgeführt wurde oder gestorben ist
Write-Host
, bearbeitet werden müssen und alles, was der Autor des Skripts über die Ausführung wissen muss (welche Elemente aktualisiert wurden, welche Felder festgelegt wurden usw.), abläuft zur Schreibausgabe. Auf diese Weise kann der Systemadministrator beim Senden eines Skripts leichtrunthescript.ps1 >someredirectedoutput.txt
auf dem Bildschirm sehen, ob alles in Ordnung ist. Senden Sie dann die "someredirectedoutput.txt" an die Entwickler zurück.quelle
Ich denke, das Folgende ist eine gute Ausstellung von Echo vs. Write-Host . Beachten Sie, wie test () tatsächlich ein Array von Ints zurückgibt, nicht ein einziges Int, wie man leicht glauben könnte.
Terminalausgang der oben genannten:
quelle
$x = test
nur gedruckt123
und nicht auch456
?Sie können diese in Ihrem Szenario verwenden, da sie in die Standard-Streams schreiben (Ausgabe und Fehler). Wenn Sie die Ausgabe an ein anderes Commandlet weiterleiten, möchten Sie Write-Output verwenden , das schließlich in Write-Host endet .
Dieser Artikel beschreibt die verschiedenen Ausgabeoptionen: PowerShell O ist für die Ausgabe vorgesehen
quelle
Magenta kann einer der Enumeratorwerte für "System.ConsoleColor" sein - Schwarz, Dunkelblau, Dunkelgrün, DunkelCyan, Dunkelrot, Dunkelagenta, Dunkelgelb, Grau, Dunkelgrau, Blau, Grün, Cyan, Rot, Magenta, Gelb, Weiß.
Das
+ $File.FullName
ist optional und zeigt, wie eine Variable in die Zeichenfolge eingefügt wird.quelle
Sie können PowerShell einfach nicht dazu bringen, diese lästigen Zeilenumbrüche zu unterlassen. Es gibt kein Skript oder Cmdlet, das dies tut.
Natürlich ist Write-Host absoluter Unsinn, weil man nicht umleiten / weiterleiten kann! Sie müssen einfach Ihre eigenen schreiben:
Z.B
quelle
In Wirkung , aber sehr leider sowohl Windows Powershell und Powershell - Core ab v7.0, senden alle ihre 6 (!) Ausgangsströme auf stdout , wenn genannt von außen , über Powershell CLI .
In diesem GitHub-Problem finden Sie eine Diskussion dieses problematischen Verhaltens, das aus Gründen der Abwärtskompatibilität wahrscheinlich nicht behoben wird.
In der Praxis bedeutet dies, dass jeder PowerShell-Stream, an den Sie die Ausgabe senden, von einem externen Anrufer als Standardausgabe angesehen wird:
Wenn Sie beispielsweise Folgendes ausführen
cmd.exe
, wird keine Ausgabe angezeigt, da die StandardumleitungNUL
für alle PowerShell-Streams gleichermaßen gilt:C:\>powershell -noprofile -command "Write-Error error!" >NUL
Allerdings - neugierig - wenn Sie stderr umleiten , Powershell hat seinen Fehlerstrom stderr senden , so dass mit
2>
Ihnen kann die Fehlerstrom - Ausgang erfassen selektiv; Die folgenden Ausgaben werden nur'hi'
ausgegeben - die Erfolgsstromausgabe - während die Fehlerstromausgabe in einer Datei erfasst wirderr.txt
:C:\>powershell -noprofile -command "'hi'; Write-Error error!" 2>err.txt
Das wünschenswerte Verhalten ist:
1
) von PowerShell an stdout .Senden Sie die Ausgabe aller anderen Streams an stderr. Dies ist die einzige Option, da zwischen den Prozessen nur 2 Ausgabestreams vorhanden sind - stdout (Standardausgabe) für Daten und stderr (Standardfehler) für Fehlermeldungen und alle anderen Arten von Nachrichten als Statusinformationen - das sind keine Daten .
Es ist ratsam, diese Unterscheidung in Ihrem Code vorzunehmen, auch wenn sie derzeit nicht eingehalten wird .
In PowerShell :
Write-Host
dient zur Anzeige der Ausgabe und umgeht den Erfolgsausgabestream. Daher kann die Ausgabe weder (direkt) in einer Variablen erfasst noch unterdrückt oder umgeleitet werden.Die ursprüngliche Absicht bestand lediglich darin, Benutzerfeedback und einfache, konsolenbasierte Benutzeroberflächen (farbige Ausgabe) zu erstellen.
Aufgrund der vor Unfähigkeit erfaßt oder umgeleitet, Powershell , Version 5 vorgenommen werden ,
Write-Host
um den neu eingeführten Informationsstrom (Anzahl6
), so seitdem es ist möglich zu erfassen und UmleitungWrite-Host
ausgegeben.Write-Error
ist zum Schreiben von nicht terminierenden Fehlern in den Fehlerstrom (Nummer2
) gedacht ; Konzeptionell entspricht der Fehlerstrom stderr.Write-Output
schreibt in den Erfolg [Ausgabe] Stream (Nummer1
), der konzeptionell stdout entspricht; Es ist der Stream, in den Daten (Ergebnisse) geschrieben werden.Write-Output
wird selten benötigt aufgrund Powershell impliziten Ausgabe Merkmal :Write-Output "Honey, I'm $HOME"
und"Honey, I'm $HOME"
sind gleichwertig, wobei letztere nicht nur prägnanter, sondern auch schneller sind.quelle