控制台应用程序仅在运行批处理脚本时按住键时终止

时间:2019-03-28 10:58:32

标签: c# batch-file console-application

我正在尝试创建一个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阻止,但是删除此行没有任何区别。我在这里还缺少其他可能阻止输入的内容吗?

2 个答案:

答案 0 :(得分:2)

只要您的consoleapp启动adb.exe,它就会失去焦点。当应用程序没有焦点时,它不会接收任何键盘输入,因为键盘输入将转到另一个焦点应用程序。

您可以通过在adb.exe运行时用鼠标选择consoleapp来获得焦点,然后按ESC。但是我想那不是您想要的。

我看到了服务器的“解决方案”:

  • 您可以找到一种使consoleapp始终成为顶级应用程序的方法。
  • 将其设置为具有错误“ QUIT”按钮的Desktop / Winform应用程序。

答案 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