簡體   English   中英

通過C#發出的命令打開另一個命令提示符

[英]command issued via C# opens another command prompt

我正在使用這樣的代碼:

System.Diagnostics.Process process = new System.Diagnostics.Process();
System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo();

startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
startInfo.FileName = "cmd.exe";
startInfo.Arguments = "/C SomeEXE inputfile.txt";
startInfo.UseShellExecute = false;
startInfo.RedirectStandardOutput = true;

process.StartInfo = startInfo;
process.Start();

// Now use streams to capture the output
StreamReader outputReader = process.StandardOutput;

process.WaitForExit();

String line = outputReader.ReadToEnd();

這很好。 但是,發出的命令(SomeEXE)導致另一個命令提示符被打開,其中包含實際結果,並等待回車將其關閉。 是否有可能獲得此輸出並發出回車? 謝謝。

直接啟動SomeEXE

如果直接啟動SomeEXE,而不是通過新的命令解釋器啟動,則可以通過將stdout重定向到outputReader來獲取輸出的現有代碼。 為此,請如下更改代碼:

startInfo.FileName = "SomeEXE";
startInfo.Arguments = "inputfile.txt";

您也可以將stdin重定向到自己的流,以便發出回車符:

http://msdn.microsoft.com/en-us/library/system.diagnostics.process.standardinput.aspx

關鍵點:

myProcess.StartInfo.RedirectStandardInput = true;
StreamWriter myStreamWriter = myProcess.StandardInput;

將Environment.NewLine寫入myStreamWriter。

但是,由於您未執行此操作,因此您正在捕獲命令解釋器的控制台。

如果您控制SomeEXE的代碼

如果您可以控制SomeEXE,則可以指示它附加到其父級的控制台:

http://www.csharp411.com/console-output-from-winforms-application/

請注意,MSDN示例顯示了非常差的異常處理。 如果拋出異常,它們將無法關閉示例中的流。 處置流的最簡單方法是將它們包裝在using語句中。

如果SomeEXE產生子進程

如果您無法控制SomeEXE的代碼,並且SomeEXE生成了子進程,則從孫子控制台獲取stdin / stdout的任務會更加困難。 但是,可以做到。

您需要獲取相關實際控制台窗口的進程ID

然后,您可以使用Win32 API AttachConsole將孫子進程的控制台附加到您自己的控制台。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM