Überprüfen Sie, ob die Ausgabe umgeleitet wird

8

Ich habe eine Konsolenanwendung in C # geschrieben, die einige Daten verarbeitet und dann die Ergebnisse ausgibt. Bis die Ergebnisse verfügbar sind, gibt es eine kleine Animation (/ - \ |) und Fortschrittsprozentsatz (xx%), der ständig aktualisiert wird.

Wenn der Benutzer die Ausgabe meiner Anwendung umleitet, wird dies offensichtlich in die Textdatei gedruckt, in die die Ausgabe umgeleitet wird. Wenn möglich, möchte ich das vermeiden.

Gibt es also eine Möglichkeit festzustellen, ob die Ausgabe meiner Anwendung umgeleitet wird? Ich denke darüber nach, nur die Fortschrittsanzeigen anzuzeigen, wenn ich mit einem bestimmten Parameter arbeite, aber ich hoffe, dass jemand eine gute Antwort für mich hat.

    
Nippysaurus 23.07.2009, 04:22
quelle

7 Antworten

3

Sie können nicht. Umgeleitete Ausgabe liegt vollständig und vollständig außerhalb des ausführenden Programms. Sie können jedoch eine Befehlszeilenoption hinzufügen, um Ihre hübsche Ausgabe zu deaktivieren, sodass sie auch umgeleitet werden kann.

BEARBEITEN: Sie können (jetzt) ​​... mit .NET 4.5 (siehe Matt Brooks ') Antwort ).

    
Matthew Scharley 23.07.2009, 04:30
quelle
11

Ab .NET Framework 4.5 können Sie das verwenden Console.IsOutputRedirected -Eigenschaft , um dies zu erkennen.

Es gibt auch Console.IsErrorRedirected .

    
Matt Brooks 13.08.2015 07:58
quelle
7

Wie sich herausstellt, wird es bald auf elegante und plattformübergreifende Weise verfügbar sein: link .

    
konrad.kruczynski 04.12.2011 14:32
quelle
5

Sie können die native Methode GetConsoleMode verwenden, um zu sehen, ob stdout geht zu einer Konsole oder nicht.

Diese Methode wird von den Anmerkungen in der Dokumentation für WriteConsole vorgeschlagen:

  

... bestimmen, ob das Ausgabehandle ein Konsolenhandle ist (eine Methode besteht darin, die GetConsoleMode-Funktion aufzurufen und zu überprüfen, ob sie erfolgreich ist) ...

    
Stobor 23.07.2009 05:12
quelle
3

Anstatt zu ermitteln, ob der Inhalt umgeleitet wird, verwende ich Console.WriteLine (oder Console.Out.WriteLine), um Ihre Ergebnisse und Console.Error.Write für Ihre Statusaktualisierungen zu drucken. Die Bildschirmausgabe wird korrekt angezeigt, aber nicht in der Textdatei wiedergegeben.

    
DocMax 23.07.2009 04:32
quelle
2

Wahrscheinlich können Sie das versuchen:

%Vor%

Wenn die Standardausgabe nicht umgeleitet wird, sollte die Ausgabe von GetFileType () 0x0002 sein. Das funktioniert für mich. :)

    
Elliott 10.05.2013 10:16
quelle
0

Console.Write("whatever") (und WriteLine) schreiben tatsächlich Daten in den Stream hinter Console.Out . Um immer einen Fortschrittsbalken auf der Konsole anzuzeigen und ihn nicht in eine Datei zu schreiben, unabhängig davon, ob die Ausgabe in eine Datei umgeleitet wird oder nicht, verwenden Sie stattdessen den Fehlerdatenstrom:

Console.Error.Write("<your progress bar>");

Wenn eine Anwendung die Ausgabe mit dem & gt; operator ( DIR C:\*.*>MORE ), nur Console.Out wird umgeleitet und nicht Console.Error

    
AyrA 18.04.2014 16:42
quelle

Tags und Links