Открытие командной строки и чтение результатов без закрытия
Я знаю, что подобные вопросы переполняют этот сайт (каламбур), но я не могу заставить его работать, не закрывая файл.bat, который я запускаю. Мне жаль, что я не очень умел в этом, но любая помощь очень ценится.
Что работает:
// Start the child process.
Process p = new Process();
// Redirect the output stream of the child process.
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = @"C:\Temp\batch.bat";
p.Start();
string output = p.StandardOutput.ReadToEnd();
string DataDate =(output.Substring(output.LastIndexOf("echo date:") + 11));
string DataID1 =(output.Substring(output.LastIndexOf("echo id1:") + 10));
string DataID2 =(output.Substring(output.LastIndexOf("echo id2:") + 10));
string DataStatus =(output.Substring(output.LastIndexOf("echo status:") + 13));
Здесь открывается файл batch.bat, который печатает несколько строк, которые я могу получить в строках, например: "echo date: 15.02.2019" идет в строку DataDate. Но я хотел бы открыть командную строку и ввести новые значения самостоятельно без закрытия командной строки. Я использую кнопку для запуска этого кода выше. Я думаю, чтобы открыть процесс CMD и хранить его каждый раз, когда появляется новая строка? Как я могу поддержать процесс и обновить мои строки новыми значениями? Например, я мог бы ввести в командную строку "echo date: 18.02.2019", и тогда это значение будет сохранено.
2 ответа
Если я правильно понимаю ваше намерение, вы хотите взаимодействия с вашим процессом. Таким образом, ваш процесс должен поддерживать это взаимодействие. Например, ваш пакетный файл может запрашивать команды и выглядеть так:
@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>
, Как следствие этого, консоль будет отображаться в течение всего времени выполнения приложения, что может быть нежелательно для вас. Честно говоря, я не знаю, как сделать это по-другому.