Wie rufe ich eine Konsolenanwendung aus meiner .NET-Anwendung auf und erfasse alle in der Konsole generierten Ausgaben?
(Denken Sie daran, ich möchte die Informationen nicht zuerst in einer Datei speichern und dann erneut auflisten, da ich sie gerne live erhalten würde.)
Antworten:
Dies kann ganz einfach mit der ProcessStartInfo.RedirectStandardOutput- Eigenschaft erreicht werden. Ein vollständiges Beispiel ist in der verknüpften MSDN-Dokumentation enthalten. Die einzige Einschränkung besteht darin, dass Sie möglicherweise auch den Standardfehlerstrom umleiten müssen, um alle Ausgaben Ihrer Anwendung anzuzeigen.
quelle
Console.Write
stattdessen einfach .Dies ist eine kleine Verbesserung gegenüber der akzeptierten Antwort von @mdb . Insbesondere erfassen wir auch die Fehlerausgabe des Prozesses. Darüber hinaus erfassen wir diese Ausgaben über Ereignisse, da
ReadToEnd()
dies nicht funktioniert, wenn Sie sowohl Fehler als auch reguläre Ausgaben erfassen möchten . Ich habe eine Weile gebraucht, um diese Arbeit zu machen, da es tatsächlich auchBeginxxxReadLine()
Anrufe danach erfordertStart()
.Asynchroner Weg:
quelle
Verwenden Sie ProcessInfo.RedirectStandardOutput , um die Ausgabe beim Erstellen Ihres Konsolenprozesses umzuleiten.
Anschließend können Sie mit Process.StandardOutput die Programmausgabe lesen.
Der zweite Link enthält einen Beispielcode für die Vorgehensweise.
quelle
ConsoleAppLauncher ist eine Open Source-Bibliothek, die speziell zur Beantwortung dieser Frage entwickelt wurde. Es erfasst alle in der Konsole generierten Ausgaben und bietet eine einfache Oberfläche zum Starten und Schließen der Konsolenanwendung.
Das ConsoleOutput-Ereignis wird jedes Mal ausgelöst, wenn eine neue Zeile von der Konsole in die Standard- / Fehlerausgabe geschrieben wird. Die Zeilen werden in die Warteschlange gestellt und folgen garantiert der Ausgabereihenfolge.
Auch als NuGet-Paket erhältlich .
Beispielaufruf, um die vollständige Konsolenausgabe zu erhalten:
Beispiel mit Live-Feedback:
quelle
Ich habe der O2-Plattform (Open Source-Projekt) eine Reihe von Hilfsmethoden hinzugefügt, mit denen Sie auf einfache Weise eine Interaktion mit einem anderen Prozess über die Konsolenausgabe und -eingabe per Skript ausführen können (siehe http://code.google.com/p/o2platform/). source / browse / trunk / O2_Scripts / APIs / Windows / CmdExe / CmdExeAPI.cs )
Für Sie könnte auch die API nützlich sein, mit der die Konsolenausgabe des aktuellen Prozesses angezeigt werden kann (in einem vorhandenen Steuerelement oder Popup-Fenster). Weitere Informationen finden Sie in diesem Blog-Beitrag: http://o2platform.wordpress.com/2011/11/26/api_consoleout-cs-inprocess-capture-of-the-console-output/ (dieses Blog enthält auch Details zum Verbrauch die Konsolenausgabe neuer Prozesse)
quelle
Ich habe eine reaktive Version erstellt, die Rückrufe für stdOut und StdErr akzeptiert.
onStdOut
undonStdErr
werden asynchron aufgerufen,sobald Daten eintreffen (bevor der Prozess beendet wird).
Anwendungsbeispiel
Folgendes wird
executable
mit ausgeführtargs
und gedrucktzur Konsole.
quelle
Von PythonTR - Python Programcıları Derneği, e-kitap, örnek :
quelle
Hinzugefügt
process.StartInfo.**CreateNoWindow** = true;
undtimeout
.quelle
StandardOutput.ReadToEnd()
, wird es erst am Ende der App zur nächsten Anweisung zurückkehren. Ihr Timeout in WaitForExit (timeoutMilliseconds) funktioniert also nicht! (Ihr Code wird hängen!)