2

我在 C# 中创建一个调用批处理文件的应用程序,然后执行另一个 .net exe 文件,然后在关闭 exe 文件时运行另一个批处理文件。

我可以运行初始批处理文件,并且可以使用该Process.start(my.exe);方法调用 exe 文件,但是如何检查 exe 文件何时最终终止以便我可以运行最终批处理文件?

4

5 回答 5

4

您可以使用Process.WaitForExit属性来确定您在应用程序中启动的进程是否已终止。

Process.WaitForExit - MSDN

指示 Process 组件无限期地等待关联的进程退出。

于 2012-09-14T04:44:36.703 回答
4

您可以调用WaitForExit()

myProcess.WaitForExit():

当关联的进程退出时(即,当它被操作系统通过正常或异常终止而关闭时),系统会存储有关该进程的管理信息并返回到调用了 WaitForExit() 的组件。然后,进程组件可以通过使用已退出进程的句柄来访问包括 ExitTime 在内的信息。

或者,在退出的事件上启用事件和挂钩代码:

myProcess.EnableRaisingEvents = true;
myProcess.Exited += new EventHandler(myProcess_Exited);

...

private void myProcess_Exited(object sender, System.EventArgs e)
{
    Console.WriteLine("Exit time:    {0}\r\n" +
        "Exit code:    {1}\r\nElapsed time: {2}", myProcess.ExitTime, myProcess.ExitCode, elapsedTime);
}

关键区别在于同步或异步。从退出的文档中:

当关联进程退出时,有两种方式得到通知:同步和异步。同步通知依赖于调用 WaitForExit 方法来暂停应用程序的处理,直到相关组件退出。异步通知依赖于 Exited 事件。在任何一种情况下,必须将 EnableRaisingEvents 设置为 true,Process 组件才能接收进程已退出的通知。

此外,当您开始运行批处理文件时,请查看此帖子:

如何从 C# 执行批处理文件?

于 2012-09-14T04:46:38.187 回答
3

使用从 Process.Start(string) 返回的 Process 对象,您可以调用 WaitForExit()。

所以:

Process process = Process.Start(programFileName); // Starts the program

// ... do some other stuff here, if necessary

process.WaitForExit(); // Waits indefinitely for the process to finish
process.Close(); // Frees resources associated with the process

// ... do other stuff here
于 2012-09-14T04:48:38.240 回答
1
        Process p = new Process();
        p.EnableRaisingEvents = true;
        //...config your process
        p.Exited += new EventHandler((s, e) =>
        {
            if (p.ExitCode == 0)
            {
                /*Launch your final batch*/
            }
            else
            {

            }

        });
        p.Start();
于 2012-09-14T04:47:29.873 回答
0

当您使用 Process.start() 启动 exe 时,您有一个Process对象...查看Exited事件和该EnableRaisingEvents对象的属性

于 2012-09-14T04:46:34.077 回答