等待进程内的进程

时间:2014-05-26 14:18:12

标签: c# process

我正在尝试构建cmd.exe包装器,但我无法弄清楚如何等待cmd进程内的进程完成。

当我在我的程序中运行ping.exe时,我的“输入线”(路径)将在ping命令完成之前输出到控制台。

我无法使用:.WaitForInputIdle();因为我没有GUI。 “这可能是因为该过程没有图形界面。”

甚至可以解决还是有更好的方法来做到这一点?

enter image description here

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ObjectTest
{
    class cmd
    {
        Process cmdProcess;
        StreamWriter cmdStreamWriter;

        public cmd()
        {
            //WinAPI.ShowConsoleWindow();
            Process();
            //WinAPI.HideConsoleWindow();
        }

        private void Process()
        {
            StartCmd();
            string command = "";
            while (command != "exit")
            {

                Thread.Sleep(100);
                cmdProcess.WaitForInputIdle();
                Console.Write(Environment.NewLine + Directory.GetCurrentDirectory() + "> ");
                command = Console.ReadLine();
                SendCommand(command);
            }
        }


        private void StartCmd()
        {
            cmdProcess = new Process();

            cmdProcess.StartInfo.FileName = "cmd.exe";
            cmdProcess.StartInfo.UseShellExecute = false;
            cmdProcess.StartInfo.CreateNoWindow = true;
            cmdProcess.StartInfo.RedirectStandardOutput = true;
            cmdProcess.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);
            cmdProcess.ErrorDataReceived += new DataReceivedEventHandler(SortOutputHandler);
            cmdProcess.StartInfo.RedirectStandardInput = true;
            cmdProcess.Start();

            cmdStreamWriter = cmdProcess.StandardInput;
            cmdProcess.BeginOutputReadLine();
        }

        private void SendCommand(string command)
        {
            cmdStreamWriter.WriteLine(command);
        }

        private void btnQuit_Click(object sender, EventArgs e)
        {
            cmdStreamWriter.Close();
            cmdProcess.WaitForExit();
            cmdProcess.Close();
        }

        private static void SortOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
        {
            if (!string.IsNullOrEmpty(outLine.Data))
            {
                Console.WriteLine(outLine.Data);
            }
        }


    }
}

2 个答案:

答案 0 :(得分:0)

如果它只是你想要捕获的实际进程,你可以使用这样的轮询方法:

  1. 在运行命令之前,使用Process.GetProcessesByName收集所有现有进程,例如ping(。exe),并存储它们的PID。

  2. 运行命令

  3. 为了等待退出,再次扫描所有ping进程,并等待以前不存在的所有进程。

  4. 请注意,如果其他流程在步骤1和3之间启动另一个ping,则会失败,或者至少不准确。

    您还应该记住CMD不等待所有类型的进程,只有那些被定义为控制台应用程序的进程(请参阅this问题)。

答案 1 :(得分:-1)

启动流程时,您可以指定要等待:

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

这是MSDN解释它的链接:http://msdn.microsoft.com/en-us/library/fb4aw7b8(v=vs.110).aspx

我认为这是你需要的。