Laden...

[Snippet] Prozess in existierender Kommandozeile starten

Erstellt von herbivore vor 6 Jahren Letzter Beitrag vor 6 Jahren 6.147 Views
herbivore Themenstarter:in
49.485 Beiträge seit 2005
vor 6 Jahren
[Snippet] Prozess in existierender Kommandozeile starten

Beschreibung:

Da ich es irgendwie immer wieder vergesse, was man tun muss, damit ein aus einem Kommandozeilenprogramm gestartetes anderes Kommandozeilenprogramm in der gleichen bzw. sogar derselben bestehenden Console läuft (die bestehende Console also an den neuen Prozess vererbt wird), schreib ich es hier mal auf (für mich und natürlich auch für andere). Es ist ganz einfach: UseShellExecute = false ist der Schlüssel (und nicht CreateNoWindow o.ä., worauf ich immer reinfalle).

Es ist auch nicht nötig, RedirectStandardOutput o.ä. zu verwenden, was neben Problemen mit Puffer und Flush, auch den Nachteil hat, dass etwaige Positionierungsanweisungen und/oder Farben in der Ausgabe verloren gehen, da beim Redirect nur der reine Text übertragen werden würde.

Mit dieser Methode startet man den neuen Prozess in der bestehenden Console:


public static int StartProcessSync (String cmd, String parms)
{
   var p = new Process ();
   p.StartInfo = new ProcessStartInfo (cmd, parms);
   p.StartInfo.UseShellExecute = false;
   p.Start ();
   p.WaitForExit();
   return p.ExitCode;
}

Das WaitForExit sorgt dafür, dass der alte Prozess erst weiter lauft, wenn der neue beendet ist, also insbesondere erst dann, wenn er seine Ausgabe beendet hat. So kommen sich die beiden Prozesse nicht in die Quere. Und per ExitCode kommt man auch noch "gratis" an den Rückgabecode des aufgerufenen Prozesses.

Schlagwörter: Prozess, Process.Start, starten, erzeugen, ausführen, Console, Consolenprogramm, Kommandozeile, Kommandozeilenprogramm, Kommandozeilen-Programm, existierende, existierenden, bestehende, bestehenden, selbe, selben, gleiche, gleichen, same, geerbte, geerbten, erben, erbende, erbender, inherit, inherited