Открытие командной строки и чтение результатов без закрытия - PullRequest
0 голосов
/ 18 февраля 2019

Я знаю, что подобные вопросы переполняют этот сайт (каламбур), но я не могу найти, чтобы это заработало, не закрывая файл .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», и тогда это значение будет сохранено.

1 Ответ

0 голосов
/ 18 февраля 2019

Если я правильно понимаю ваше намерение, вы хотите взаимодействия с вашим процессом.Таким образом, ваш процесс должен поддерживать это взаимодействие.Например, ваш пакетный файл может запрашивать команды и выглядеть следующим образом:

@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>.Как следствие этого, консоль будет отображаться в течение всего времени выполнения приложения, что может быть нежелательно для вас.Честно говоря, я не знаю, как сделать это по-другому.

...