151 votes

Capturer la sortie de la console d'une application .NET (C#)

Comment invoquer une application console à partir de mon application .NET et capturer toute la sortie générée dans la console ?

(N'oubliez pas que je ne veux pas enregistrer les informations dans un fichier, puis les réinscrire sur la liste, car j'aimerais les recevoir en direct).

0 votes

3 votes

Veuillez consulter les dates des deux questions et voir laquelle est "en double"

1 votes

Le "doublon possible" est un moyen de faire le ménage, c'est-à-dire de fermer les questions similaires et de conserver celle qui contient les meilleures réponses. La date n'est pas essentielle. Voir aussi Dois-je voter pour fermer une question dupliquée, même si elle est beaucoup plus récente et a des réponses plus à jour ? Si vous estimez qu'une clarification est nécessaire, veuillez voter sur Ajouter un lien de clarification au commentaire automatisé "Possible duplicate" (doublon possible)

183voto

mdb Points 20629

Ceci peut être facilement réalisé en utilisant la fonction ProcessStartInfo.RedirectStandardOutput propriété. Un exemple complet est contenu dans la documentation MSDN liée ; la seule mise en garde est que vous devrez peut-être aussi rediriger le flux d'erreur standard pour voir toute la sortie de votre application.

Process compiler = new Process();
compiler.StartInfo.FileName = "csc.exe";
compiler.StartInfo.Arguments = "/r:System.dll /out:sample.exe stdstr.cs";
compiler.StartInfo.UseShellExecute = false;
compiler.StartInfo.RedirectStandardOutput = true;
compiler.Start();    

Console.WriteLine(compiler.StandardOutput.ReadToEnd());

compiler.WaitForExit();

4 votes

Si vous ne voulez pas de nouvelle ligne supplémentaire à la fin, utilisez simplement Console.Write au lieu de cela.

3 votes

Il convient de noter que si vous utilisez ReadToEnd() en combinaison avec une application console qui a la capacité d'inviter l'utilisateur à entrer des données. Par exemple : Overwrite File : Y or N ? etc. ReadToEnd peut alors entraîner une fuite de mémoire, puisque le processus ne se termine jamais pendant qu'il attend l'entrée de l'utilisateur. La manière la plus sûre de capturer la sortie est d'utiliser le gestionnaire d'événement process.OutputDataReceived et de laisser le processus notifier votre application de la sortie à recevoir.

0 votes

Comment capturer si dans le cas où le code est déployé sur azure webapp, puisque le compilateur.StartInfo.FileName = "csc.exe" ; peut ne pas exister !

13voto

Franci Penov Points 45358

Utilice ProcessInfo.RedirectStandardOutput pour rediriger la sortie lors de la création du processus de la console.

Vous pouvez alors utiliser Sortie standard du processus pour lire la sortie du programme.

Le deuxième lien contient un exemple de code sur la façon de procéder.

10voto

SlavaGu Points 369

ConsoleAppLauncher est une bibliothèque open source conçue spécifiquement pour répondre à cette question. Elle capture toutes les sorties générées dans la console et fournit une interface simple pour démarrer et fermer l'application console.

L'événement ConsoleOutput est déclenché à chaque fois qu'une nouvelle ligne est écrite par la console sur la sortie standard/erreur. Les lignes sont mises en file d'attente et il est garanti qu'elles suivront l'ordre de sortie.

Également disponible sous forme de Paquet NuGet .

Exemple d'appel pour obtenir la sortie complète de la console :

// Run simplest shell command and return its output.
public static string GetWindowsVersion()
{
    return ConsoleApp.Run("cmd", "/c ver").Output.Trim();
}

Échantillon avec retour d'information en direct :

// Run ping.exe asynchronously and return roundtrip times back to the caller in a callback
public static void PingUrl(string url, Action<string> replyHandler)
{
    var regex = new Regex("(time=|Average = )(?<time>.*?ms)", RegexOptions.Compiled);
    var app = new ConsoleApp("ping", url);
    app.ConsoleOutput += (o, args) =>
    {
        var match = regex.Match(args.Line);
        if (match.Success)
        {
            var roundtripTime = match.Groups["time"].Value;
            replyHandler(roundtripTime);
        }
    };
    app.Run();
}

2voto

Dinis Cruz Points 1042

J'ai ajouté un certain nombre de méthodes d'aide à la fonction Plate-forme O2 (projet Open Source) qui vous permet de facilement script une interaction avec un autre processus via la sortie et l'entrée de la console (voir http://code.google.com/p/o2platform/source/browse/trunk/O2_Scripts/APIs/Windows/CmdExe/CmdExeAPI.cs )

L'API qui permet d'afficher la sortie de la console du processus en cours (dans un contrôle existant ou une fenêtre contextuelle) pourrait également vous être utile. Voir ce billet de blog pour plus de détails : http://o2platform.wordpress.com/2011/11/26/api_consoleout-cs-inprocess-capture-of-the-console-output/ (ce blog contient également des détails sur la façon de consommer la sortie de la console des nouveaux processus)

0 votes

Depuis, j'ai ajouté plus de support pour l'utilisation de ConsoleOut (dans ce cas, si vous démarrez le processus .NET vous-même). Jetez un coup d'œil : Comment utiliser la sortie de la console dans le REPL C# ? , Ajouter 'Console Out' à l'IDE VisualStudio en tant que fenêtre native , Visualisation des messages "Console Out" créés dans les UserControls

1voto

livetogogo Points 21

De _PythonTR - Python Programmers Association, e-book, sample_ :

Process p = new Process();   // Create new object
p.StartInfo.UseShellExecute = false;  // Do not use shell
p.StartInfo.RedirectStandardOutput = true;   // Redirect output
p.StartInfo.FileName = "c:\\python26\\python.exe";   // Path of our Python compiler
p.StartInfo.Arguments = "c:\\python26\\Hello_C_Python.py";   // Path of the .py to be executed

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X