Dieser Beitrag wurde zuletzt am 7. Dezember 2020 aktualisiert.
4 min lesen.
Hin und wieder stößt man auf eine Situation, in der man die Konsolenausgabe (oder das Transkript) einer laufenden Konsolenanwendung irgendwie ausgeben muss. Ich behaupte mal, dass das viel häufiger vorkommt, als man denkt – in meinem Fall immer dann, wenn ein Kunde einen Webjob oder eine Funktion, die man normalerweise auf Azure deployen würde, auf den Servern des Kunden laufen lassen möchte. Dieser Beitrag beschreibt, wie man das macht.
Problem
Inhaltsverzeichnis
Etwas geht kaputt oder die App stürzt ab, und der Fehler wird im Ereignisprotokoll protokolliert… Aber nur der Fehler, nicht das ganze Protokoll. Sie würden gerne alles bekommen, um herauszufinden, was eigentlich los ist, aber das Ereignisprotokoll ist nicht der richtige Weg dafür.
Oder vielleicht untersuchen Sie einen Fehler, der jemand anderem passiert ist, aber Sie bekommen nur Screenshots von Konsolen- oder Ereignisprotokollfehlern, während Sie stattdessen alle möglichen Informationen über das Problem erhalten möchten.
Was tun?
Lösung: Umleitungsoperator > zur Rettung!
Es ist zum Glück ziemlich einfach. Es gibt mehrere Möglichkeiten, die Ausgabe zu pipen, zu dumpen, umzuleiten, zu protokollieren, zu spiegeln oder einfach nur auf fast jedes erdenkliche Zielmedium zu speichern, aber da ich es hasse, immer danach zu googeln (und beim besten Willen nicht in der Lage bin, mich auswendig zu erinnern), dokumentiere ich hier meinen bevorzugten Weg.
Es ist nicht nötig, die Ausgabe über eine Pipe in eine Datei zu leiten – denn die Umleitung macht nativ das, was Sie mit einer Pipe und „Out-File -FilePath“ oder einem ähnlichen Befehl machen könnten.
Wie leitet man in der Powershell die Ausgabe in eine Datei um?
Sie können die gesamte Konsolenausgabe (und damit das gesamte PowerShell-Transkript für Ihre ausführbare Datei) in eine Textdatei umleiten, indem Sie etwa so vorgehen:
executable.exe > output.txt 2>&1
OR
ausführbar.exe *>&> output.txt
Diese Methode schreibt einfach alles aus dem Konsolenfenster in eine Datei – so einfach ist das!
Und natürlich, ist es nicht nur auf die Eingabeaufforderung (cmd.exe) – es funktioniert auch in der Windows PowerShell:
Wenn Sie überprüfen möchten, ob dies funktioniert, können Sie das Folgende in der PowerShell ausführen – es gibt zunächst „Hello World“ aus und leitet es dann einfach in die Dateiausgabe um.txt:
echo „Hello World“ >output.txt 2>&1.\output.txt
Der zweite Befehl sollte die Datei output.txt im Texteditor öffnen – und sie sollte „Hello World“ enthalten.
In diesen Beispielen beeinflussen die folgenden Parameter das Ergebnis:
Element | Beschreibung |
Umleitungsoperator: > | Schreibt die Befehlsausgabe in eine Datei oder ein Gerät, z. B. einen Drucker, statt in das Eingabeaufforderungsfenster. |
2>&1 | Diese Parameter bewirken, dass dieser Befehl zuerst stdout (Standard Output Stream) in die Ausgabedatei umleitet und dann auch stderr (Standard Error Stream) dorthin umleitet. |
Okay – jetzt ist es also endlich dokumentiert. Vielleicht muss ich es beim nächsten Mal nicht mehr googeln 🙂
Warten Sie… Aber wie ist das besser als das Kopieren aus einem Konsolenfenster?
Wenn Sie Ihre Anwendung nicht unbeaufsichtigt laufen lassen, könnten Sie einfach die Anwendung starten und per Copy-Paste aus dem Fenster an die gewünschte Stelle einfügen. Das ist schön und einfach! Was macht diese Methode also besser?
Ein paar Dinge fallen mir dazu ein:
Warum ist die Ausgabe der Konsole in eine Datei besser als einfaches Kopieren und Einfügen
- Sie können die Abschriften unbeaufsichtigt erhalten. Sie müssen nichts selbst tun.
- So bringen Sie das Kopieren nicht durcheinander, indem Sie Bereiche der Ausgabe auswählen.
- Ich weiß nicht, wie es Ihnen geht, aber ich bringe das Kopieren und Einfügen aus einer Konsole oder einem PowerShell-Fenster oft durcheinander. Diese Methode macht das unmöglich.
- Dies ist der einfachste Weg, den ich gefunden habe, um andere Personen um die gesamte Ausgabe/das gesamte Transkript einer ausgeführten Konsolenanwendung zu bitten.
- Das ist wirklich nützlich, denn wenn ich debugge, will ich wirklich das ganze Protokoll und nicht nur die letzten paar Zeilen roten Textes!
Weitere Gedanken
Weitere Infos und Optionen zu den Ausgabeszenarien finden Sie in diesem Stack Overflow-Thread. Wenn Sie mehr über stdout und stderr lesen wollen, schauen Sie hier nach.
Und als weitere Referenz finden Sie hier eine Liste aller unterstützten Umleitungsoperatoren für einigermaßen aktuelle PowerShell-Versionen (wahrscheinlich gültig für PowerShell >5.1):
Umleitung | Was macht man damit? |
---|---|
> | Sendet Ausgabe in die angegebene Datei | >> | Sendet die Ausgabe an den Inhalt der angegebenen Datei |
2> | Sendet Fehler an die angegebene Datei. |
2>> | Hängt Fehler an den Inhalt der angegebenen Datei an |
2>&1 | Sendet Fehler und Erfolgsausgaben an die den Erfolgsausgabestrom |
3> | Sendet Warnungen in die angegebene Datei |
3>> | Hängt Warnungen an den Inhalt der angegebenen Datei an. |
3>&1 | Sendet Warnungen und Erfolgsausgaben an den Erfolgsausgabestrom |
4> | Sendet ausführliche Ausgaben in die angegebene Datei |
4>> | Hält verbose Ausgabe an den Inhalt der angegebenen Datei |
4>&1 | Sendet verbose Ausgabe und Erfolgsausgabe an den Erfolgsausgabestrom |
5> | Sendet Debug-Meldungen an die angegebene Datei |
5>> | Hängt Debug-Meldungen an den Inhalt der angegebenen Datei an |
5>&1 | Sendet Debug-Meldungen und Erfolgsausgaben an den Erfolgsausgabestrom |
6> | Sendet Informations Nachrichten an eine angegebene Datei |
6>> | Hängt Informationsnachrichten an den Inhalt einer angegebenen Datei an |
6>&1 | Sendet Informationsmeldungen und Erfolgs ausgaben an den Erfolgsausgabestrom. |
*> | Sendet alle Ausgabetypen an die angegebene Datei |
*>> | Sendet alle Ausgabetypen an den Inhalt der angegebenen Datei |
*>&1 | Sendet alle Ausgabetypen an die Erfolgsausgabe stream |
Wie auch immer, ein weitaus fortschrittlicheres Szenario wäre es, die Ausgabe direkt in Application Insights oder etwas Ähnlichem zu speichern. Für viele Fälle wäre das so, als würde man eine Fliege mit einer Bazooka erschießen, aber für größere Deployments, warum nicht. Vielleicht später einen Blogbeitrag wert!
- Autor
- Recent Posts
Er ist seit 2004 Entwickler (angefangen mit PHP und Java), und er hat SharePoint seit MOSS in verschiedene Formen gebogen und verdreht. Heutzutage arbeitet er nicht nur an SharePoint, sondern auch an .NET-Projekten, Azure, Office 365 und vielen anderen Dingen. Außerdem ist er Microsoft MVP für Office-Entwicklung.
Dies ist sein persönliches, professionelles (d.h. professionelles, aber definitiv persönliches) Blog.
- Anleitung: Wie kann man einen viralen AAD-Mieter übernehmen und töten? – 24. März 2021
- Wie kann man alle in einer PowerShell-Sitzung geladenen Assemblies auflisten? – 18. März 2021
- Of Course I Still #ValoLove You – 15. März, 2021