等待命令在C#中完成

时间:2009-07-23 06:13:47

标签: c#

我是C#的新手,并尝试开发一个小型应用程序,在内部打开命令提示符并在此处执行一些命令。这是我到目前为止所做的:

    m_command = new Process();
    m_command.StartInfo.FileName = @"cmd.exe";
    m_command.StartInfo.UseShellExecute = false;
    m_command.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
    m_command.StartInfo.CreateNoWindow = true;
    m_command.StartInfo.RedirectStandardInput = true;
    m_command.StartInfo.RedirectStandardOutput = true;

    m_command.Start();

    m_reader = m_command.StandardOutput;
    m_writer = m_command.StandardInput;

    m_writer.WriteLine("Somecommand"); //execute some command

如您所见,我已重定向输入和输出。我的问题是如何同步执行“some命令”,即我想使用重定向输出读取命令的结果。为此,我必须等到我使用WriteLine调用的命令才能完成。我该怎么做?

5 个答案:

答案 0 :(得分:15)

这实际上取决于命令的作用。您可以等待该进程退出Process.WaitForExit,同时从另一个帖子中的m_readerOutputDataReceived进行阅读。只有在命令完成后进程退出时,这才有效。 (注意,来读取输出,否则它可能会填满输出缓冲区并基本上阻止该过程。)

另一个选项是,如果在命令完成时您将获得一定的输出 - 例如下一个命令提示符。麻烦的是,如果你的命令输出同样的东西,你就会弄错。

感觉就像启动这样的命令提示符不是一个很好的方法。您是否每次都没有创建单独的流程?

另一种选择:如果您可以通过命令行计算出刚刚启动的过程,您可以找到Process并等待 退出。虽然这很棘手 - 我真的会尝试重新设计你的解决方案。

答案 1 :(得分:9)

你可以打电话

 m_command.WaitForExit();

答案 2 :(得分:8)

这是我在一个小项目中使用的:

processStartInfo startInfo = new ProcessStartInfo();
    startInfo.CreateNoWindow = true;
    startInfo.UseShellExecute = false;
    startInfo.WindowStyle = ProcessWindowStyle.Hidden;
    startInfo.FileName = "cmd.exe";
    startInfo.Arguments = command;

// Start the process with the info we specified.
    // Call WaitForExit and then the using statement will close.
    using(Process exeProcess = Process.Start(startInfo))
    {
        exeProcess.WaitForExit();
    }

答案 3 :(得分:3)

最简单的方法是将所有命令放入.cmd文件,执行该命令并使用

 Process.Start("cmdfile").WaitForExit();

答案 4 :(得分:0)

您可以在输出中等待提示。

也很棘手。