Isso pode ser facilmente alcançado usando a propriedade ProcessStartInfo.RedirectStandardOutput . Um exemplo completo está contido na documentação vinculada do MSDN; a única ressalva é que talvez seja necessário redirecionar o fluxo de erros padrão para ver toda a saída do seu aplicativo.
Se você não quiser uma nova linha extra no final, use-a Console.Write.
TM1
2
Deve-se observar que, se você usar ReadToEnd () em combinação com um aplicativo de console com capacidade para solicitar entrada do usuário. Por exemplo: Substituir arquivo: S ou N? etc Então ReadToEnd pode resultar em um vazamento de memória, pois o processo nunca sai enquanto aguarda a entrada do usuário. A maneira mais segura de capturar a saída é usar o manipulador de eventos process.OutputDataReceived e permitir que o processo notifique seu aplicativo sobre a saída a ser recebida.
Baaleos
Como capturar se, no caso de o código ser implantado no azure webapp, desde o compiler.StartInfo.FileName = "csc.exe"; pode não existir!
Asif Iqbal
Como capturar se, no caso de o código ser implantado no azure webapp, desde o compiler.StartInfo.FileName = "csc.exe"; pode não existir!
Asif Iqbal
37
Isso é um pouco melhor do que a resposta aceita do @mdb . Especificamente, também capturamos a saída de erro do processo. Além disso, capturar estas saídas através de eventos porque ReadToEnd()não funciona se você deseja capturar tanto erro e saída regular. Levei algum tempo para fazer esse trabalho, porque na verdade também requer BeginxxxReadLine()ligações depois Start().
Maneira assíncrona:
using System.Diagnostics;Process process =newProcess();voidLaunchProcess(){
process.EnableRaisingEvents=true;
process.OutputDataReceived+=newSystem.Diagnostics.DataReceivedEventHandler(process_OutputDataReceived);
process.ErrorDataReceived+=newSystem.Diagnostics.DataReceivedEventHandler(process_ErrorDataReceived);
process.Exited+=newSystem.EventHandler(process_Exited);
process.StartInfo.FileName="some.exe";
process.StartInfo.Arguments="param1 param2";
process.StartInfo.UseShellExecute=false;
process.StartInfo.RedirectStandardError=true;
process.StartInfo.RedirectStandardOutput=true;
process.Start();
process.BeginErrorReadLine();
process.BeginOutputReadLine();//below line is optional if we want a blocking call//process.WaitForExit();}void process_Exited(object sender,EventArgs e){Console.WriteLine(string.Format("process exited with code {0}\n", process.ExitCode.ToString()));}void process_ErrorDataReceived(object sender,DataReceivedEventArgs e){Console.WriteLine(e.Data+"\n");}void process_OutputDataReceived(object sender,DataReceivedEventArgs e){Console.WriteLine(e.Data+"\n");}
ConsoleAppLauncher é uma biblioteca de código aberto criada especificamente para responder a essa pergunta. Ele captura toda a saída gerada no console e fornece uma interface simples para iniciar e fechar o aplicativo do console.
O evento ConsoleOutput é acionado toda vez que uma nova linha é gravada pelo console na saída padrão / erro. As linhas são enfileiradas e garantidas para seguir a ordem de saída.
Exemplo de chamada para obter a saída completa do console:
// Run simplest shell command and return its output.publicstaticstringGetWindowsVersion(){returnConsoleApp.Run("cmd","/c ver").Output.Trim();}
Amostra com feedback ao vivo:
// Run ping.exe asynchronously and return roundtrip times back to the caller in a callbackpublicstaticvoidPingUrl(string url,Action<string> replyHandler){var regex =newRegex("(time=|Average = )(?<time>.*?ms)",RegexOptions.Compiled);var app =newConsoleApp("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();}
Eu fiz uma versão reativa que aceita retornos de chamada para stdOut e StdErr. onStdOute onStdErrsão chamados de forma assíncrona,
assim que os dados chegam (antes da saída do processo).
O seguinte será executado executablecom argse impresso
stdOut em branco
stdErr em vermelho
para o console.
RunProcess(
executable,
args,
s =>{Console.ForegroundColor=ConsoleColor.White;Console.WriteLine(s);},
s =>{Console.ForegroundColor=ConsoleColor.Red;Console.WriteLine(s);});
Process p =newProcess();// 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
Quando você o usa, StandardOutput.ReadToEnd()ele não retornará à próxima instrução até o final do aplicativo. para que seu tempo limite em WaitForExit (timeoutMilliseconds) não funcione! (o seu código irá travar!)
Respostas:
Isso pode ser facilmente alcançado usando a propriedade ProcessStartInfo.RedirectStandardOutput . Um exemplo completo está contido na documentação vinculada do MSDN; a única ressalva é que talvez seja necessário redirecionar o fluxo de erros padrão para ver toda a saída do seu aplicativo.
fonte
Console.Write
.Isso é um pouco melhor do que a resposta aceita do @mdb . Especificamente, também capturamos a saída de erro do processo. Além disso, capturar estas saídas através de eventos porque
ReadToEnd()
não funciona se você deseja capturar tanto erro e saída regular. Levei algum tempo para fazer esse trabalho, porque na verdade também requerBeginxxxReadLine()
ligações depoisStart()
.Maneira assíncrona:
fonte
Use ProcessInfo.RedirectStandardOutput para redirecionar a saída ao criar o processo do console.
Em seguida, você pode usar Process.StandardOutput para ler a saída do programa.
O segundo link tem um código de exemplo como fazê-lo.
fonte
ConsoleAppLauncher é uma biblioteca de código aberto criada especificamente para responder a essa pergunta. Ele captura toda a saída gerada no console e fornece uma interface simples para iniciar e fechar o aplicativo do console.
O evento ConsoleOutput é acionado toda vez que uma nova linha é gravada pelo console na saída padrão / erro. As linhas são enfileiradas e garantidas para seguir a ordem de saída.
Também disponível como pacote NuGet .
Exemplo de chamada para obter a saída completa do console:
Amostra com feedback ao vivo:
fonte
Adicionei vários métodos auxiliares à plataforma O2 (projeto Open Source) que permitem criar facilmente uma interação com outro processo por meio da saída e entrada do console (consulte http://code.google.com/p/o2platform/ source / browse / trunk / O2_Scripts / APIs / Windows / CmdExe / CmdExeAPI.cs )
Também é útil para você a API que permite a visualização da saída do console do processo atual (em uma janela existente de controle ou pop-up). Consulte esta postagem do blog para obter mais detalhes: http://o2platform.wordpress.com/2011/11/26/api_consoleout-cs-inprocess-capture-of-the-console-output/ (este blog também contém detalhes de como consumir a saída do console de novos processos)
fonte
Eu fiz uma versão reativa que aceita retornos de chamada para stdOut e StdErr.
onStdOut
eonStdErr
são chamados de forma assíncrona,assim que os dados chegam (antes da saída do processo).
Exemplo de uso
O seguinte será executado
executable
comargs
e impressopara o console.
fonte
From PythonTR - Python Programcıları Derneği, e-kitap, örnek :
fonte
Adicionado
process.StartInfo.**CreateNoWindow** = true;
etimeout
.fonte
StandardOutput.ReadToEnd()
ele não retornará à próxima instrução até o final do aplicativo. para que seu tempo limite em WaitForExit (timeoutMilliseconds) não funcione! (o seu código irá travar!)