Holen Sie sich Live-output von Prozess
Ich habe ein problem in meinem Projekt. Ich möchte einen Prozess starten, 7z.exe (Konsolen-version).
Ich habe versucht drei verschiedene Dinge:
- Prozess.StandardOutput.ReadToEnd();
- OutputDataReceived & BeginOutputReadLine
- StreamWriter
Nichts funktioniert. Es ist immer "warten" für das Ende des Prozesses zu zeigen, was ich will.
Ich habe keine Codes zu setzen, nur wenn Sie will, dass mein code durch eines der Dinge, die aufgeführt upthere. Danke.
Bearbeiten:
Mein code:
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.CreateNoWindow = true;
process.Start();
this.sr = process.StandardOutput;
while (!sr.EndOfStream)
{
String s = sr.ReadLine();
if (s != "")
{
System.Console.WriteLine(DateTime.Now + " - " + s);
}
}
Oder
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.OutputDataReceived += new DataReceivedEventHandler(recieve);
process.StartInfo.CreateNoWindow = true;
process.Start();
process.BeginOutputReadLine();
process.WaitForExit();
public void recieve(object e, DataReceivedEventArgs outLine)
{
System.Console.WriteLine(DateTime.Now + " - " + outLine.Data);
}
Oder
process.StartInfo.UseShellExecute = false;
process.StartInfo.RedirectStandardOutput = true;
process.Start();
string output = p.StandardOutput.ReadToEnd();
process.WaitForExit();
Wobei "Prozess" ist meine pre-made-Prozess
Ok, ich weiß, warum es nicht funktioniert: 7z.exe ist der bug: es zeigt eine Prozent laden in der Konsole, und es sendet nur Informationen, wenn die aktuelle Datei abgeschlossen ist. Bei der Extraktion zum Beispiel, es funktioniert :). Ich Suche nach einer anderen Art und Weise zu verwenden, 7z-Funktionen ohne 7z.exe (vielleicht mit 7za.exe oder mit einigen DLL). Vielen Dank an alle.
Die Antwort auf die Frage, OuputDataRecieved Veranstaltung funktioniert !
Es würde helfen, zu sehen, den code, den Sie versucht haben, mit Prozess-zum Beispiel, wenn Sie erstellen den Prozess
Da 7z.exe umfasst alle Funktionen, die ich wollte.
? Ich brauche wirklich Hilfe. Ich werde versuche mit cmd. Ich denke, das problem kommt von 7z.exe.
InformationsquelleAutor Extaze | 2012-01-10
Du musst angemeldet sein, um einen Kommentar abzugeben.
Werfen Sie einen Blick auf diese Seite, sieht es aus, das ist die Lösung für Sie: http://msdn.microsoft.com/en-us/library/system.diagnostics.process.beginoutputreadline.aspx und http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardoutput.aspx
[Bearbeiten]
Dies ist ein funktionierendes Beispiel:
Btw ls -R C:\ Listen Sie alle Dateien aus dem root von C: rekursiv. Das sind eine Menge Dateien und ich bin mir sicher, dass es nicht geschieht, wenn die ersten Ergebnisse zeigen, bis auf dem Bildschirm.
Gibt es eine Möglichkeit, 7zip enthält die Ausgabe, bevor es zu zeigen. Ich bin mir nicht sicher, was params geben Sie dem proces.
Alle die ich finden kann, ist Sie sollten das Ereignis OutputDataReceived, im moment habe ich keine Zeit um es zu testen, vielleicht später. (harbertc.wordpress.com/2006/05/16/...)
Ich habe alles versucht, aber das problem war 7z.exe. Ich habe beschlossen, eine 7z-Bibliothek für c# (SevenZipSharp) und das problem war gelöst. Danke 😉
Ich habe das exakt gleiche problem mit 7-zip und stream-Ausgabe-Umleitung. Wenn Sie nur Blick auf 7-zip Ausgabe, es ist offensichtlich, dass es nicht der Durchführung der standard-Ausgabe in der Konsole, sondern scheint zu sein, aufrufen von console-Funktionen, die neu zu schreiben, was auf der Anzeige, um zu zeigen, eine Fortschrittsanzeige in Prozent. Der Grund, warum Sie nicht bekommen, so lange ausgegeben, bis das Ende, ist, dass es gar nicht schreiben, dass die standard-Konsole die Ausgabe erst ganz am Schluss, als eine Art Letzte Protokoll.
p.BeginErrorReadLine();
benötigt wird, sonst Fehler-handler nicht aufgerufen werdenInformationsquelleAutor Michiel van Vaardegem
Ich weiß nicht, ob jemand noch auf der Suche nach einer Lösung für dieses, aber es hat sich mehrere Male für mich, denn ich bin ein tool zu schreiben, in der die Einheit in der Unterstützung von einigen spielen und aufgrund der begrenzten Interoperabilität von bestimmten Systemen mit mono (wie PIA für das Lesen von text aus Word, zum Beispiel), ich habe oft zu schreiben, die OS-spezifisch sind (manchmal Windows, manchmal MacOS) Programme, und starten Sie Sie vom Prozess.Start().
Das problem ist, beim starten einer ausführbaren Datei wie diese, es geht um Feuer in einem anderen thread, dass Blöcke Ihre Haupt-app, was zu einem hängen. Wenn Sie möchten, um nützliche Rückmeldungen zu Ihren Benutzern, die während dieser Zeit über die spinning-Symbole heraufbeschworen, indem Sie Ihre jeweiligen OS, dann Sie sind irgendwie geschraubt. Mit einem stream nicht funktionieren, da der thread noch so lange gesperrt, bis die Ausführung beendet.
Die Lösung, die ich getroffen habe, der mag extrem für einige Leute, aber ich finde der funktioniert ganz gut für mich, ist die Verwendung von sockets und multithreading sicheren synchronen Kommunikation zwischen den beiden apps. Natürlich funktioniert dies nur, wenn Sie authoring beide apps. Wenn nicht, ich denke, Sie sind aus Glück heraus. ... Würde ich mag, um zu sehen, ob es funktioniert mit nur multithreading mit einem herkömmlichen stream-Ansatz, wenn also jemand möchte, um zu versuchen und die Ergebnisse hier posten, dass wäre Super.
Ohnehin, hier ist die Lösung derzeit für mich arbeiten:
In der main, oder der Aufruf app, die ich tun so etwas wie dieses:
Hier, wo ich herstellen der socket-server:
Hier ist meine socket-handler für den thread... beachten Sie, dass Sie zum erstellen mehrerer threads in einigen Fällen, das ist, warum ich, dass _builderCommThreads Liste drin (ich portiert von code-stellen, an denen ich etwas Tat, was ähnlich aber anrufen, mehrere Instanzen in einer Zeile):
Natürlich, Sie müssen erklären, dass bestimmte Sachen bis an die Spitze:
...dann in die aufgerufene ausführbare Datei, richten Sie das andere Ende (ich habe die Statik in diesem Fall können Sie verwenden, was immer Sie wollen):
...Ich bin mit diesem zum starten einer Befehlszeilen-Tools auf Windows, nutzt der PIA-Zeug, ziehen Sie text aus einem Word-doc. Ich habe versucht PIA die .dlls in der Einheit, sondern lief in interop-Probleme mit mono. Ich bin auch mit ihm auf MacOS zum aufrufen von shell-Skripts starten, die zusätzliche Einheit Instanzen im batchmode und ausführen editor Skripte in diesen Fällen, dass die Diskussion wieder auf das tool über diese socket-Verbindung. Es ist toll, denn ich kann jetzt senden Sie feedback an den Benutzer, Debuggen, überwachen und reagieren auf bestimmte Schritte in der Prozess, et cetera, et cetera.
HTH
InformationsquelleAutor user2848240
Richtig zu verarbeiten, Ausgabe und/oder Fehler-Umleitung müssen Sie auch umleiten von Eingabe.
Es scheint feature/bug in der runtime von der externen Anwendung, die Sie starten und von dem, was ich bisher gesehen habe, es wird sonst nirgendwo erwähnt.
Beispiel:
...
InformationsquelleAutor user3042599
Habe ich die CmdProcessor Klasse beschrieben hier auf mehrere Projekte mit viel Erfolg. Es sieht ein bisschen einschüchternd auf den ersten, aber ist sehr einfach zu bedienen.
InformationsquelleAutor joebalt
Versuchen.
Lassen Sie die oben in einem
thread
.Nun für die Aktualisierung der Ausgabe zu UI verwenden,können Sie ein
timer
mit zwei LinienDies kann helfen, Sie
Als Michiel sagte, das ist für das "Finale" - Ausgabe
InformationsquelleAutor sonu thomas