【问题标题】:How to close a child command window when using Start.Process();使用 Start.Process() 时如何关闭子命令窗口;
【发布时间】:2014-07-01 03:57:44
【问题描述】:

我希望在命令完成后触发子命令窗口的关闭事件。请记住,它是从控制台应用程序启动的后台进程,因此它永远不可见。可见的是控制台应用程序。

我尝试使用 Exited 事件,但没有成功。我尝试依靠 CMD 来知道何时使用 /c、/k 和退出来关闭它。两者似乎都不起作用。我还尝试了一个 do while 循环检查 HasExited,除非我在应用程序控制台窗口中键入“exit”,否则这些都不起作用。它不会关闭,但会以某种方式触发不可见的子命令窗口关闭。

子命令完成后是否有另一种关闭它的方法?

String msg = "echo %time%; exit;";  
System.Diagnostics.Process p = new System.Diagnostics.Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "cmd.exe";
p.StartInfo.Arguments = msg;
p.EnableRaisingEvents = true;
p.Exited += p_Exited; 
p.Start();
msg += p.StandardOutput.ReadToEnd();

非常感谢!!

【问题讨论】:

    标签: c# .net cmd


    【解决方案1】:

    我稍微修改了您的程序以运行子命令处理器,捕获其输出,然后将其写入控制台。

            char quote = '"';
            string msg = "/C " + quote + "echo %time%" + quote;
            System.Diagnostics.Process p = new System.Diagnostics.Process();
            p.StartInfo.UseShellExecute = false;
            p.StartInfo.RedirectStandardOutput = true;
            p.StartInfo.FileName = "cmd.exe";
            p.StartInfo.Arguments = msg;
            p.EnableRaisingEvents = true;
            p.Exited += (_, __) => Console.WriteLine("Exited!");
            p.Start();
            string msg1 = p.StandardOutput.ReadToEnd();
    
            Console.WriteLine(msg1);
    

    这是一个完整的程序,使用的语法略有不同,但精神相似:

    using System;
    using System.Diagnostics;
    
    namespace ConsoleApplication1
    {
        class Program
        {
            static void Main(string[] args)
            {
                char quote = '"';
                var startInfo = new ProcessStartInfo("cmd", "/C " + quote + "echo %time%" + quote)
                { UseShellExecute = false, RedirectStandardOutput = true };
    
                var process = new Process { EnableRaisingEvents = true };
                process.StartInfo = startInfo;
                process.Exited += (_, __) => Console.WriteLine("Exited!");
                process.Start();
                string msg1 = process.StandardOutput.ReadToEnd();
    
                Console.WriteLine(msg1);
    
                Console.ReadLine();
            }
        }
    }
    

    或者,如this answer 所示,也许只需致电DateTimeOffset.Now。如果您有兴趣查看亚秒级信息,可以改用Stopwatch 类。

    如果您更喜欢使用 C# 中的命令来驱动命令行,这也是可能的。 Igor Ostrovsky describes如何将事件转化为Tasks;然后使用 async/await 创建一个程序化的命令和响应序列。

    【讨论】:

    • 这太棒了! - 谢谢你,格雷格!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-12-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-28
    • 2018-03-01
    相关资源
    最近更新 更多