Я пытаюсь создать консольное приложение C #, которое неоднократно запускает файл .bat и сохраняет вывод в переменную, которая будет изменена позже. Сценарий предназначен для получения открытых TCP-соединений на подключенном устройстве с использованием adb.exe
.
Я хочу, чтобы приложение закрывалось при нажатии клавиши Esc (один раз). Для этого я следовал этому ответу и реализовал его так:
Program.cs
static void Main(string[] args)
{
Console.WriteLine("Press escape to quit");
do
{
while (!Console.KeyAvailable)
{
// Console.WriteLine("Application is running");
RunBatch();
}
} while (Console.ReadKey(true).Key != ConsoleKey.Escape);
Console.WriteLine("While loop was exited");
Console.ReadLine();
}
static void RunBatch()
{
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = @"C:\Dev\Batch\GetTcpConnections.bat";
p.Start();
string output = p.StandardOutput.ReadToEnd();
p.WaitForExit();
Console.WriteLine(output);
}
GetTcpConnections.bat
@echo off
echo %time%
adb.exe shell cat /proc/net/tcp
timeout /t 1 /nobreak>nul
Ожидаемый результат: консольное приложение выходит из цикла и печатает While loop was exited
непосредственно после нажатия Esc . Это работает так, когда я комментирую RunBatch()
и не комментирую Console.WriteLine("Application is running"
. Однако, когда я запускаю пакетный скрипт, мне нужно удерживать Esc в течение секунды или двух, прежде чем программа выйдет из цикла while, вместо того, чтобы быть мгновенным.
Сначала я подумал, что ввод может быть заблокирован timeout /t 1 /nobreak>nul
в пакетном скрипте, но удаление этой строки не имело значения. Я что-то здесь упускаю, что может блокировать ввод?