2010-01-13 58 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