Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/301.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在进程中等待进程_C#_Process - Fatal编程技术网

C# 在进程中等待进程

C# 在进程中等待进程,c#,process,C#,Process,我正在尝试构建一个cmd.exe包装器,但我不知道如何等待cmd进程内的进程完成 当我在程序中运行ping.exe时,我的“inputline”(路径)将在ping命令完成之前输出到控制台 我无法使用:。WaitForInputIdle();因为我没有GUI。“这可能是因为该进程没有图形界面。” 甚至有可能解决这个问题吗?或者有更好的方法吗 using System; using System.Collections.Generic; using System.Diagnostics; usin

我正在尝试构建一个cmd.exe包装器,但我不知道如何等待cmd进程内的进程完成

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

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

甚至有可能解决这个问题吗?或者有更好的方法吗

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);
            }
        }


    }
}


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

var process = Process.Start(...);
process.WaitForExit();
以下是MSDN的链接,对此进行了解释:


我认为这是您需要的。

如果您只想捕获实际进程,则可以使用如下轮询方法:

  • 在运行该命令之前,使用并存储其PID收集所有现有进程,例如,
    ping
    (.exe)

  • 运行命令

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

  • 请注意,如果另一个进程将在步骤1和步骤3之间启动另一个
    ping
    ,则此操作将失败,或者至少不准确


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

    它不会工作。因为该程序正在等待cmd.exe完成,而不是ping.exe,并且您是否总是要执行ping.exe命令,否则您可以启动ping.exe而不是cmd.exe+1来尝试回答信息不足的问题。否,我希望能够将cmd.exe用作cmd,但要与另一个输入/输出一起使用,以便发送其他命令。您尝试使用PowerShell脚本执行的操作通常与通过包装命令外壳无法完成该操作的原因完全相同。重新思考您的策略以及您正试图实现的目标。您不能使用
    cmd
    流程启动批处理文件吗?这将按顺序启动命令并等待响应。这对我没有帮助。Ping.exe只是一个例子。我可能想运行一个dir命令,然后在查看dir命令后,我想运行多个cd命令等等。您能清楚地告诉我们您想做什么吗?(-1)@richard问题的第一句话是:“我正在尝试构建一个cmd.exe包装器”。什么不清楚?@richard什么不清楚?阅读主题和问题。。。