Wie führe ich ein Befehlszeilenprogramm von C # aus und erhalte die STD OUT-Ergebnisse zurück? Insbesondere möchte ich DIFF für zwei Dateien ausführen, die programmgesteuert ausgewählt wurden, und die Ergebnisse in ein Textfeld schreiben.
c#
command-line
Flügel
quelle
quelle
Antworten:
Der Code stammt von MSDN .
quelle
{YourProcessObject}.StartInfo.Arguments
Zeichenfolge Argumente hinzufügen .p.StandardError
Stream geschrieben hat. Wenn der Stream voll ist, scheint der Prozess anzuhalten, bis die Daten verbraucht sind. Daher muss ich beide lesenStandardError
undStandardOutput
sicherstellen, dass eine Aufgabe korrekt ausgeführt wird.Hier ist ein kurzes Beispiel:
quelle
Dort fand ich einen weiteren Parameter nützlich, mit dem ich das Prozessfenster eliminiere
Dies hilft, das schwarze Konsolenfenster vollständig vor dem Benutzer zu verbergen, wenn Sie dies wünschen.
quelle
quelle
process.StartInfo.RedirectStandardError = true;
undif (process.ExitCode == 0)
welche akzeptierte Antwort hat nicht.Die akzeptierte Antwort auf dieser Seite weist eine Schwäche auf, die in seltenen Situationen problematisch ist. Es gibt zwei Dateihandles, in die Programme gemäß Konvention schreiben: stdout und stderr. Wenn Sie nur ein einzelnes Dateihandle wie die Antwort von Ray lesen und das Programm, das Sie starten, genügend Ausgabe in stderr schreibt, füllt es den Ausgabe-Stderr-Puffer und -Block. Dann sind Ihre beiden Prozesse festgefahren. Die Puffergröße kann 4 KB betragen. Dies ist bei kurzlebigen Programmen äußerst selten, aber wenn Sie ein lang laufendes Programm haben, das wiederholt an stderr ausgegeben wird, wird es irgendwann passieren. Dies ist schwierig zu debuggen und aufzuspüren.
Es gibt ein paar gute Möglichkeiten, damit umzugehen.
Eine Möglichkeit besteht darin, cmd.exe anstelle Ihres Programms auszuführen und das Argument / c für cmd.exe zu verwenden, um Ihr Programm zusammen mit dem Argument "2> & 1" für cmd.exe aufzurufen, damit stdout und stderr zusammengeführt werden.
Eine andere Möglichkeit besteht darin, ein Programmiermodell zu verwenden, das beide Handles gleichzeitig liest.
quelle
quelle
Sie müssen
ProcessStartInfo
mitRedirectStandardOutput
aktiviert verwenden - dann können Sie den Ausgabestream lesen. Möglicherweise ist es einfacher, ">" zu verwenden, um die Ausgabe in eine Datei umzuleiten (über das Betriebssystem) und dann einfach die Datei zu lesen.[bearbeiten: wie Ray es getan hat: +1]
quelle
RedirectStandardOutput
.Wenn es Ihnen nichts ausmacht, eine Abhängigkeit einzuführen, kann CliWrap dies für Sie vereinfachen:
quelle
Dies ist möglicherweise nicht der beste / einfachste Weg, kann aber eine Option sein:
Wenn Sie aus Ihrem Code ausführen, fügen Sie "> output.txt" hinzu und lesen Sie dann die Datei output.txt ein.
quelle
Sie können jedes Befehlszeilenprogramm mit der Process-Klasse starten und die StandardOutput-Eigenschaft der Process-Instanz mit einem von Ihnen erstellten Stream-Reader festlegen (entweder basierend auf einer Zeichenfolge oder einem Speicherort). Nachdem der Vorgang abgeschlossen ist, können Sie alle erforderlichen Änderungen an diesem Stream vornehmen.
quelle
Dies kann für jemanden nützlich sein, wenn Sie versuchen, den lokalen ARP-Cache auf einem PC / Server abzufragen.
quelle
Einzeiliger Ausführungsbefehl:
Lesen Sie die Ausgabe des Befehls in kürzester Menge des Reable-Codes:
quelle
In PublicDomain Open Source Code gibt es eine ProcessHelper-Klasse, die Sie interessieren könnte.
quelle
Falls Sie auch einen Befehl in der cmd.exe ausführen müssen, können Sie Folgendes tun:
Dies gibt nur die Ausgabe des Befehls selbst zurück:
Sie können auch
StandardInput
anstelle vonStartInfo.Arguments
:Das Ergebnis sieht folgendermaßen aus:
quelle
Nur zum Spaß, hier ist meine fertige Lösung, um PYTHON-Ausgabe - mit einem Klick auf eine Schaltfläche - mit Fehlerberichterstattung zu erhalten. Fügen Sie einfach eine Schaltfläche namens "butPython" und eine Bezeichnung namens "llHello" hinzu ...
quelle
Da die meisten Antworten hier implementieren nicht den
using
statemant fürIDisposable
und einige andere Sachen Wich ich denken konnte nessecary sein ich diese Antwort hinzufügen.Für C # 8.0
quelle