Если я правильно понимаю ваше намерение, вы хотите взаимодействия с вашим процессом.Таким образом, ваш процесс должен поддерживать это взаимодействие.Например, ваш пакетный файл может запрашивать команды и выглядеть следующим образом:
@echo off
:loop
echo Enter a command:
set /p userCommand=""
%userCommand%
goto :loop
Вы не можете использовать p.StandardOutput.ReadToEnd()
, поскольку поток вывода не будет завершен, пока не будет завершен вывод.Вы можете использовать OutputDataReceived
для выполнения асинхронного чтения.Попробуйте этот код с приведенными выше пакетными командами:
Process process = new Process();
process.StartInfo.FileName = @"C:\Temp\batch.bat";
process.StartInfo.RedirectStandardOutput = true;
process.StartInfo.UseShellExecute = false;
process.OutputDataReceived += new DataReceivedEventHandler((sender, e) =>
{
// Prepend line numbers to each line of the output.
if (!String.IsNullOrEmpty(e.Data))
{
Console.WriteLine(e.Data);// to see what happens
// parse e.Data here
}
});
process.Start();
// Asynchronously read the standard output of the spawned process.
// This raises OutputDataReceived events for each line of output.
process.BeginOutputReadLine();
process.WaitForExit();
process.Close();
Обновление
Чтобы приложение Windows Forms работало, вам нужно изменить VS Project Properties -> Application -> Output Type
с Windows Application
до Console Application
.Или вы можете сделать это, отредактировав файл *.csproj
и заменив <OutputType>WinExe</OutputType>
на <OutputType>Exe</OutputType>
.Как следствие этого, консоль будет отображаться в течение всего времени выполнения приложения, что может быть нежелательно для вас.Честно говоря, я не знаю, как сделать это по-другому.