[英]Embedding a CMD terminal in a C# Winforms application
我打算做的是構建一個應用程序,該應用程序除其他外將像某些IDE一樣在其中嵌入命令行(我發現這非常有用)。
這是我到目前為止的代碼,請注意這是一個Winforms項目:
public partial class Form1 : Form
{
Process p = new Process();
ProcessStartInfo info = new ProcessStartInfo();
public Form1() {
InitializeComponent();
}
private void Form1_Load(object sender, EventArgs e) {
info.FileName = "cmd.exe";
info.RedirectStandardInput = true;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
info.UseShellExecute = false;
info.CreateNoWindow = true;
p.StartInfo = info;
p.Start();
}
private void button1_Click(object sender, EventArgs e) {
using(StreamWriter sw = p.StandardInput) {
if(sw.BaseStream.CanWrite) {
sw.WriteLine(textBox1.Text);
}
}
textBox2.Text = p.StandardOutput.ReadToEnd();
textBox3.Text = p.StandardError.ReadToEnd();
p.WaitForExit();
}
}
}
如您所見,有3個文本框和一個按鈕:
關於我的問題:
我只能輸入一個命令,因為執行后,我的CMD窗口消失了。 我知道它消失了,因為我已經設置了info.CreateNoWindow = false;
它的確消失了,如果我嘗試輸入另一個命令,我會得到一個例外。
我將如何繼續保持CMD窗口“活動”,以便我可以隨意使用它? 簡而言之,我想真正模仿CMD行為。
如果不清楚,請隨時詢問更多信息。
額外信息/我嘗試了什么:
我嘗試添加info.Attributes = "/K";
因為我知道/K
應該可以使CMD保持活動狀態。 我也讀過p.WaitForExit();
應該可以使CMD保持活動狀態,但是從我看來,這僅是為了讀取輸出。 不用說,因為我已經重定向了它的輸出,所以我不需要。 這些解決方案都不起作用,但是我完全有可能以錯誤的方式使用它們。
我需要一個活着的進程,因此我可以輕松地使用cd
導航並在需要時執行命令序列,例如在訪問ftp
或mysql
。 我知道我可以使用參數解決這兩個示例,但不能針對每個應用程序。 簡而言之,每次都生成一個新進程不是我想要的。 我希望該CMD接口始終保持打開狀態。
cmd進程死於
using(StreamWriter sw = p.StandardInput) {
if(sw.BaseStream.CanWrite) {
sw.WriteLine(textBox1.Text);
}
}
但我無法查明原因。
CMD控制台提供的是用於執行預定義功能的界面(在System32或%PATH%中)。 流程類也具有相同的功能,您可以執行以下操作:當用戶輸入命令文本並在textbox2中按回車鍵(可以是多行,黑色背景,白色文本)時,可以將命令文本傳遞給Process p = new Process();
並附加結果,使其看起來像單個cmd會話。 現在,在傳遞整個命令文本之前,我們需要分離參數(如果有的話),即出現在第一個空格之后的文本。 例:
SHUTDOWN /S /T 10
其中Shutdown將是文件名,/ S / T 10將是參數。
執行ProcessStartInfo的設置默認目錄之前:-
_processStartInfo.WorkingDirectory = @"%Path%";
否則默認為System32文件夾。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.