c# - 在 C# Winforms 应用程序中嵌入 CMD 终端

标签 c# process createprocess

我打算做的是构建一个应用程序,除其他外,它将像某些 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 个文本框和一个按钮:

  • textbox1 用于输入命令
  • textbox2 用于标准输出
  • textbox3 用于标准错误

关于我的问题:

我只能输入一个命令,因为执行它后,我的CMD窗口消失了。我知道它会消失,因为我设置了 info.CreateNoWindow = false; 它确实消失了,如果我尝试输入另一个命令,我会得到一个异常。

我该如何继续让我的 CMD 窗口保持“事件”状态,以便我可以随心所欲地使用它?简而言之,我想真正模仿 CMD 行为。

如果有什么不清楚的地方,请随时询问更多信息。

额外信息/我尝试了什么:

我尝试添加 info.Attributes = "/K"; 因为我知道 /K 应该让 CMD 保持事件状态。我还读到 p.WaitForExit(); 应该让 CMD 保持事件状态,但据我所知,这只是为了读取输出。不用说,我不需要它,因为我已经重定向了它的输出。这些解决方案都不起作用,但我完全有可能以错误的方式使用它们。

我需要该进程处于事件状态,以便我可以使用 cd 轻松导航并在需要时执行一系列命令,例如访问 ftpmysql。我知道我可以使用参数解决这两个示例,但不是针对每个应用程序。简而言之,每次都产生一个新进程不是我想要的。我希望 CMD 界面始终处于打开状态。

cmd进程在

之后死亡
using(StreamWriter sw = p.StandardInput) {
    if(sw.BaseStream.CanWrite) {
        sw.WriteLine(textBox1.Text);
    }
}

但我无法确定原因。

最佳答案

CMD控制台提供的是一个接口(interface)来执行预定义的函数(在System32或%PATH%中)。 Process 类也具有相同的功能,您可以做的是当用户在文本框 2(可以是多行、黑色背景、白色文本)中输入命令文本并按下回车键时,您可以通过命令文本到 Process p = new Process(); 并附加结果,使其看起来像单个 cmd session 。现在,在传递整个命令文本之前,我们需要分隔参数(如果有的话),即出现在第一个空格之后的文本。示例:

SHUTDOWN /S /T 10

Shutdown 是文件名,/S/T 10 是参数。

在执行之前设置 ProcessStartInfo 的默认目录:-

_processStartInfo.WorkingDirectory = @"%Path%";

否则默认为 System32 文件夹。

关于c# - 在 C# Winforms 应用程序中嵌入 CMD 终端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33079046/

相关文章:

对 SignalR 集线器方法的 Javascript 调用不返回值

c - 在这种情况下最好使用哪种流程

linux - 在 Linux 中 fork COW

java - 你如何在java中获取进程ID?

java - 获取 java.io.IOException : CreateProcess: c:\Windows\System32\My_exe 1 error=2

c# - 无论如何确定ListView中Column左上角的坐标?

c# - TextBox GotFocus 事件没有响应

C# - foreach 表现出奇怪的行为/工作没有问题

c - 无法将当前进程 ID 转移到子进程 ID

windows - 让CreateProcess继承调用进程的控制台