找出进程是否已完成运行

时间:2013-02-05 13:59:25

标签: c# batch-file process client-server wmi

我有一台服务器从客户端接收命令并运行它们。 这些命令使用一个特定的批处理脚本,它接收参数并运行。 该脚本使用这些参数调用外部控制台应用程序。 参数还可以指示脚本在后台运行控制台应用程序的多个实例。因此,结果可能是一个开放的CMD,在后台运行3个app.exe个实例。

我希望知道app.exe的每个进程何时完成(并使用其参数获取每个特定的命令行),并将其发送给客户端。

有什么想法吗?

3 个答案:

答案 0 :(得分:2)

您是否考虑过从背景工作者处调用此脚本?

你的背景工作者会执行这样的事情:

static void ExecuteCommand(string command)
{
    int exitCode;
    ProcessStartInfo processInfo;
    Process process;

    processInfo = new ProcessStartInfo("cmd.exe", "/c " + command);
    processInfo.CreateNoWindow = true;
    processInfo.UseShellExecute = false;
    // *** Redirect the output ***
    processInfo.RedirectStandardError = true;
    processInfo.RedirectStandardOutput = true;

    process = Process.Start(processInfo);
    process.WaitForExit();

    // *** Read the streams ***
    string output = process.StandardOutput.ReadToEnd();
    string error = process.StandardError.ReadToEnd();

    exitCode = process.ExitCode;

    Console.WriteLine("output>>" + (String.IsNullOrEmpty(output) ? "(none)" : output));
    Console.WriteLine("error>>" + (String.IsNullOrEmpty(error) ? "(none)" : error));
    Console.WriteLine("ExitCode: " + exitCode.ToString(), "ExecuteCommand");
    process.Close();
}

static void Main()
{
    ExecuteCommand("echo testing");
}  

这样,您可以通过检查BackgroundWorker.IsBusy状态来测试是否完成了该过程。您甚至可以在流程结束时更新用户。

希望这有帮助!

答案 1 :(得分:0)

如果使用Process.Start启动进程,它应该返回一个可用于跟踪生命周期的Process对象,并且使用属性HasExited和ExitTime可以确定它是否结束以及何时结束。

答案 2 :(得分:0)

在你的问题中不是很清楚,但我假设你想要监视由另一个进程启动的进程。换句话说,对它们使用Process.Start()是没有意义的。

您可以使用Process.GetProcessByName()根据应用程序名称获取正在运行的进程列表。

如果有,您可以使用the Exited event找出流程何时退出(您还必须设置EnableRaisingEvents)。例如:

var processes = Process.GetProcessesByName(processName);
foreach (var process in processes)
{
    Console.WriteLine("{0} running.", process);
    process.Exited += (sender, e) => Console.WriteLine("{0} exited.", sender);
    process.EnableRaisingEvents = true;
}

请注意存在竞争条件:如果在调用GetProcessesByName()之后但在设置事件处理程序之前进程退出,则可能不会引发Exited事件。

另一个问题是如何确定应用程序何时启动。我不知道有什么东西可以让你监控新开始的流程,所以我认为你必须反复拨打GetProcessesByName(),直到你得到你期望的答案。