我正在尝试创建一个C#控制台应用程序,该应用程序反复运行.bat文件并将输出保存到以后要修改的变量中。该脚本旨在使用adb.exe
在连接的设备上获得开放的TCP连接。
我希望按 Esc 键(一次)时退出应用程序。为此,我遵循了this answer并将其实现为:
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
预期结果是,控制台应用程序退出循环并在按 Esc 时直接打印While loop was exited
。当我评论RunBatch()
和取消评论Console.WriteLine("Application is running"
时,它的工作方式如下。但是,当我运行批处理脚本时,我需要在程序退出while循环之前按住 Esc 大约一两秒钟,而不是立即执行。
起初,我认为输入可能会被批处理脚本中的timeout /t 1 /nobreak>nul
阻止,但是删除此行没有任何区别。我在这里还缺少其他可能阻止输入的内容吗?
答案 0 :(得分:2)
只要您的consoleapp启动adb.exe
,它就会失去焦点。当应用程序没有焦点时,它不会接收任何键盘输入,因为键盘输入将转到另一个焦点应用程序。
您可以通过在adb.exe
运行时用鼠标选择consoleapp来获得焦点,然后按ESC
。但是我想那不是您想要的。
我看到了服务器的“解决方案”:
答案 1 :(得分:1)
下面的代码应该可以解决您的问题。请注意,我已将超时从批处理文件移开,并将其放置在while
循环中。
Program.cs
private static void Main(string[] args)
{
Console.WriteLine("Press escape to quit");
do
{
while (!Console.KeyAvailable)
{
RunBatch();
Thread.Sleep(1000);
}
} while (Console.ReadKey(true).Key != ConsoleKey.Escape);
Console.WriteLine("While loop has exited");
Console.ReadLine();
}
private static void RunBatch()
{
var process = new Process
{
StartInfo =
{
UseShellExecute = false,
RedirectStandardOutput = true,
FileName = @"C:\Dev\Batch\GetTcpConnections.bat"
}
};
process.Start();
Console.WriteLine(process.StandardOutput.ReadToEnd());
}
GetTcpConnections.bat
@echo off
echo %time%
adb.exe shell cat /proc/net/tcp