2010-01-13 60 views
1

我正在通过C#System.Diagnostics.Process运行一个命令行进程。如何使用C#System.Diagnostics.Process与提示进行交互?

当我在cmd.exe中输入相同的命令时,它立即提示我输入密码。输入密码后,该过程继续完成。

但是,使用System.Diagnotic.Process,我重定向的标准输出都不会产生密码提示。如果是这样,我会用重定向的标准输入的WriteLine方法以编程方式输入它。

通常在使用Process对象的输出中看不到提示?提示与其他标准输出行不同吗?如果是这样,那么如何将“提示事件”带入我的应用程序,输入输入,然后让程序按照它在cmd.exe中的相同方式继续进行?

回答

2

当您重定向用C/C++编写的程序的输出时,stdout流切换到缓冲模式。提示符在那里,它从来没有从内部缓冲区刷新到流中,因为缓冲区没有被填充到容量。只需编写密码可能会解决您的问题。

+0

大多数命令行程序会提示对stderr流密码,不是吗? – 2010-01-13 00:37:00

+0

我试过使用Process.StandardInput.WriteLine(“密码”),但过程只是挂起,因为我没有输入密码。 第一个人提到我必须重定向流。如果是这样,为什么调用这个方法不会导致异常。它的行为就像已经有一个输入流作为过程对象的一个​​属性。 – 2010-01-13 03:17:08

+0

丹尼尔,当他们相应的事件发生时,我将错误输出和常规输出添加到文本框中。然而,当我在cmd.exe中执行完全相同的命令时,我看不到我看到的提示。 – 2010-01-13 03:19:39

0

当准备ProcessStartInfoProcess.Start电话时,一定要正确设置以下属性:

  1. RedirectStandardInput
  2. RedirectStandardOutput
  3. RedirectStandardError

和创建Process对象化妆后确保为appropr使用以下属性莱特重定向流:

  1. StandardInput
  2. StandardOutput
  3. StandardError
+0

您不能设置这些属性,因为它们是只读的......但是,您可以读取/写入由这些属性返回的流 – 2010-01-13 00:58:20

+0

StartInfo对象的RedirectStandardInput,RedirectStandardOutput和RedirectStandardError已全部设置为true,正如你试图确认的那样。 – 2010-01-13 03:10:16

+0

但是,我已经通过两个独立的DataRecievedEventHandler对象成功获取OutputDataReceived和ErrorDataReceived事件的输出和错误,这些对象调用将其输出到文本框(不显式创建任何流)的自定义方法。 – 2010-01-13 03:11:05