我是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调用的命令才能完成。我该怎么做?
答案 0 :(得分:15)
这实际上取决于命令的作用。您可以等待该进程退出Process.WaitForExit
,同时从另一个帖子中的m_reader
或OutputDataReceived
进行阅读。只有在命令完成后进程退出时,这才有效。 (注意,有来读取输出,否则它可能会填满输出缓冲区并基本上阻止该过程。)
另一个选项是,如果在命令完成时您将获得一定的输出 - 例如下一个命令提示符。麻烦的是,如果你的命令输出同样的东西,你就会弄错。
感觉就像启动这样的命令提示符不是一个很好的方法。您是否每次都没有创建单独的流程?
另一种选择:如果您可以通过命令行计算出刚刚启动的过程,您可以找到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)
您可以在输出中等待提示。
也很棘手。