Добрый день.
Необходимо запустить процесс с выводом и вводом данных. Есть бат файл который формирует вспомогательные файлы для запуска exe файла. И потом в данном bat файле запускает exe файл(стороннее приложение) с параметрами сформированных файлов. Exe файл выполняет компиляцию данных с выводом в консоль определенных данных. Я перехватываю вывод этих данных и вывожу у себя в приложении. Но бывают случаи когда компиляция в exe прекращается по ошибке (не находит устройство) и выводит сообщение о с просьбой прекратить или попробывать еще раз найти данное устройство. Так вот почемуто в мое приложение не до конца попадает сообщение и я никак не могу понять как мне перехватить ввод.
Если бат файл запусти cmd то получаю корретное сообщение и запрос на ввод
Проверка аппаратного устройства
Не найден сервер аппаратного устройства!
Проверьте, запущен ли этот сервер!
[b]Продолжить поиск аппаратного устройства? [ Y-да N-нет ] :[/b]
А у меня процесс подвисает в таком состоянии
Проверка аппаратного устройства
Не найден сервер аппаратного устройства!
Проверьте, запущен ли этот сервер!
т.е. не выводит последнюю строку с запросом.
Вот мой код. Что я не так делаю ?
class Program
{
static void Main()
{
Runner run = new Runner();
run.OnOnputDataReceived += run_OnOnputDataReceived;
run.OnExited += run_OnExited;
run.OnErrorDataReceived += run_OnErrorDataReceived;
run.Run();
run.Close();
Console.ReadKey();
}
static void run_OnExited(object sender, EventArgs e)
{
Console.WriteLine("EXIT PROCESS");
}
static void run_OnErrorDataReceived(object sender, EventArgs e)
{
Console.WriteLine(string.Format("EXIT Error: {0}", ((DataReceivedEventArgs)e).Data));
}
static void run_OnOnputDataReceived(object sender, EventArgs e)
{
Console.WriteLine(((DataReceivedEventArgs)e).Data);
}
}
public class Runner
{
Process p;
public Runner()
{ }
public void Run()
{
Process[] processList = Process.GetProcessesByName("vip");
foreach (Process pp in processList)
{
pp.Kill();
}
p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.FileName = @"D:\App\RunApp.bat";
p.StartInfo.CreateNoWindow = false;
p.StartInfo.RedirectStandardError = true;
p.StartInfo.RedirectStandardInput = true;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.WorkingDirectory = @"G:\App";
p.StartInfo.StandardOutputEncoding = Encoding.GetEncoding(866);
p.StartInfo.ErrorDialog = true;
p.EnableRaisingEvents = true;
p.Exited += RunProcess_Exited;
p.ErrorDataReceived += p_ErrorDataReceived;
p.OutputDataReceived += p_OutputDataReceived;
p.Start();
p.BeginOutputReadLine();
p.BeginErrorReadLine();
p.WaitForExit();
Console.WriteLine(p.ExitCode);
}
public event EventHandler OnErrorDataReceived;
void p_ErrorDataReceived(object sender, DataReceivedEventArgs e)
{
if (OnErrorDataReceived != null)
{
OnErrorDataReceived(sender, e);
}
}
public event EventHandler OnExited;
void RunProcess_Exited(object sender, EventArgs e)
{
if (OnExited != null)
{
OnExited(sender, e);
}
}
public event EventHandler OnOnputDataReceived;
void p_OutputDataReceived(object sender, DataReceivedEventArgs e)
{
if (!string.IsNullOrEmpty(e.Data))
{
if (OnOnputDataReceived != null)
{
OnOnputDataReceived(sender, e);
}
}
}
public void Close()
{
p.Close();
}
}
В общем мне нужно как-то получать интерактивный вывод и при необнодимости ввода данных произвести данный ввод.