Этого довольно легко добиться с помощью свойства ProcessStartInfo.RedirectStandardOutput . Полный образец содержится в связанной документации MSDN; единственное предостережение: вам, возможно, придется перенаправить и стандартный поток ошибок, чтобы увидеть весь вывод вашего приложения.
Если вам не нужна дополнительная новая строка в конце, просто используйте Console.Writeвместо нее.
tm1 08
2
Следует отметить, что если вы используете ReadToEnd () в сочетании с консольным приложением, которое имеет возможность запрашивать у пользователя ввод. Например: перезаписать файл: ДА или НЕТ? и т.д. Тогда ReadToEnd может привести к утечке памяти, поскольку процесс никогда не завершается, ожидая ввода данных пользователем. Более безопасный способ захвата вывода - использовать обработчик событий process.OutputDataReceived и позволить процессу уведомлять ваше приложение о получении вывода.
Baaleos
Как зафиксировать, если в случае развертывания кода в azure webapp, поскольку compiler.StartInfo.FileName = "csc.exe"; может не существует!
Асиф Икбал,
Как зафиксировать, если в случае развертывания кода в azure webapp, поскольку compiler.StartInfo.FileName = "csc.exe"; может не существует!
Асиф Икбал,
37
Это небольшое улучшение по сравнению с принятым ответом от @mdb . В частности, мы также фиксируем вывод ошибок процесса. Кроме того, мы фиксируем эти выходные данные через события, потому что ReadToEnd()это не работает, если вы хотите фиксировать как ошибки, так и обычные выходные данные. Мне потребовалось время, чтобы выполнить эту работу, потому что на самом деле также требуются BeginxxxReadLine()звонки после Start().
Асинхронный способ:
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 - это библиотека с открытым исходным кодом, созданная специально для ответа на этот вопрос. Он фиксирует весь вывод, сгенерированный в консоли, и предоставляет простой интерфейс для запуска и закрытия консольного приложения.
Событие ConsoleOutput запускается каждый раз, когда консоль записывает новую строку в стандартный вывод или вывод ошибок. Строки ставятся в очередь и гарантированно следуют порядку вывода.
Пример вызова для получения полного вывода на консоль:
// Run simplest shell command and return its output.publicstaticstringGetWindowsVersion(){returnConsoleApp.Run("cmd","/c ver").Output.Trim();}
Образец с обратной связью:
// 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();}
Также вам может быть полезен API, который позволяет просматривать вывод на консоль текущего процесса (в существующем элементе управления или всплывающем окне). Дополнительную информацию см. В этом сообщении в блоге: http://o2platform.wordpress.com/2011/11/26/api_consoleout-cs-inprocess-capture-of-the-console-output/ (этот блог также содержит сведения о том, как потреблять консольный вывод новых процессов)
Я сделал реактивную версию, которая принимает обратные вызовы для stdOut и StdErr. onStdOutи onStdErrвызываются асинхронно,
как только данные поступают (до завершения процесса).
Следующее будет работать executableс argsи печатать
stdOut в белом
stdErr красным
к консоли.
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
Когда вы используете, StandardOutput.ReadToEnd()он не вернется к следующему оператору до конца приложения. так что ваш тайм-аут в WaitForExit (timeoutMilliseconds) не работает! (ваш код
Ответы:
Этого довольно легко добиться с помощью свойства ProcessStartInfo.RedirectStandardOutput . Полный образец содержится в связанной документации MSDN; единственное предостережение: вам, возможно, придется перенаправить и стандартный поток ошибок, чтобы увидеть весь вывод вашего приложения.
источник
Console.Write
вместо нее.Это небольшое улучшение по сравнению с принятым ответом от @mdb . В частности, мы также фиксируем вывод ошибок процесса. Кроме того, мы фиксируем эти выходные данные через события, потому что
ReadToEnd()
это не работает, если вы хотите фиксировать как ошибки, так и обычные выходные данные. Мне потребовалось время, чтобы выполнить эту работу, потому что на самом деле также требуютсяBeginxxxReadLine()
звонки послеStart()
.Асинхронный способ:
источник
Используйте ProcessInfo.RedirectStandardOutput для перенаправления вывода при создании консольного процесса.
Затем вы можете использовать Process.StandardOutput для чтения вывода программы.
Вторая ссылка содержит пример кода, как это сделать.
источник
ConsoleAppLauncher - это библиотека с открытым исходным кодом, созданная специально для ответа на этот вопрос. Он фиксирует весь вывод, сгенерированный в консоли, и предоставляет простой интерфейс для запуска и закрытия консольного приложения.
Событие ConsoleOutput запускается каждый раз, когда консоль записывает новую строку в стандартный вывод или вывод ошибок. Строки ставятся в очередь и гарантированно следуют порядку вывода.
Также доступен как пакет NuGet .
Пример вызова для получения полного вывода на консоль:
Образец с обратной связью:
источник
Я добавил несколько вспомогательных методов в платформу O2 (проект с открытым исходным кодом), которые позволяют легко создавать сценарии взаимодействия с другим процессом через вывод и ввод консоли (см. Http://code.google.com/p/o2platform/ источник / просмотр / транк / O2_Scripts / API / Windows / CmdExe / CmdExeAPI.cs )
Также вам может быть полезен API, который позволяет просматривать вывод на консоль текущего процесса (в существующем элементе управления или всплывающем окне). Дополнительную информацию см. В этом сообщении в блоге: http://o2platform.wordpress.com/2011/11/26/api_consoleout-cs-inprocess-capture-of-the-console-output/ (этот блог также содержит сведения о том, как потреблять консольный вывод новых процессов)
источник
Я сделал реактивную версию, которая принимает обратные вызовы для stdOut и StdErr.
onStdOut
иonStdErr
вызываются асинхронно,как только данные поступают (до завершения процесса).
Пример использования
Следующее будет работать
executable
сargs
и печататьк консоли.
источник
Из PythonTR - Python Programcıları Derneği, e-kitap, örnek :
источник
Добавлены
process.StartInfo.**CreateNoWindow** = true;
иtimeout
.источник
StandardOutput.ReadToEnd()
он не вернется к следующему оператору до конца приложения. так что ваш тайм-аут в WaitForExit (timeoutMilliseconds) не работает! (ваш код