重定向cmd输出到文本框

本文关键字:文本 输出 cmd 重定向 | 更新日期: 2023-09-27 18:13:09

我正在将"命令提示符"重新创建到Windows窗体中。应用程序不能正常工作;我也不知道为什么。

当窗体加载时,它应该运行cmd.exe(加载cmd信息到"TextBox_Receive"),但它没有;以及在"textBox_send"(发送输入)中编写任何命令后;只有按2次或3次回车键才会显示输入。

知道我在这里错过了什么吗?

public partial class Form1 : Form
{
    // Global Variables:
    private static StringBuilder cmdOutput = null;
    Process p;
    StreamWriter SW;
    public Form1()
    {
        InitializeComponent();
        textBox1.Text = Directory.GetCurrentDirectory();
        // TextBox1 Gets the Current Directory
    }
    private void Form1_Load(object sender, EventArgs e)
    {
        checkBox1.Checked = true;
        // This checkBox activates / deactivates writing commands into the "textBox_Send"
        cmdOutput = new StringBuilder("");
        p = new Process();
        p.StartInfo.FileName = "cmd.exe";
        p.StartInfo.UseShellExecute = false;
        p.StartInfo.CreateNoWindow = true;
        p.StartInfo.RedirectStandardInput = true;
        p.StartInfo.RedirectStandardOutput = true;
        p.StartInfo.RedirectStandardError = true;
        p.EnableRaisingEvents = true;
        p.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);
        p.Start();
        SW = p.StandardInput;
        p.BeginOutputReadLine();
        p.BeginErrorReadLine();            
    }
    private static void SortOutputHandler(object sendingProcess, DataReceivedEventArgs outLine)
// I dont actually understand this part of the code; as this is a "copy" of a snippet i found somewhere. Although it fixed one of my issues to redirect.
    {
        if (!String.IsNullOrEmpty(outLine.Data))
        {
            cmdOutput.Append(Environment.NewLine + outLine.Data);
        }
    }
    private void textBox1_KeyPress(object sender, KeyPressEventArgs e)
    {
        // Send "Enter Key" - Send Command
        if (e.KeyChar == 13)
        {
            SW.WriteLine(txtbox_send.Text);
            txtbox_receive.Text = cmdOutput.ToString();
            txtbox_send.Clear();
        }
    }
    private void checkBox1_CheckedChanged(object sender, EventArgs e)
    {
        // Enable / Disable Sending Commands
        if (checkBox1.Checked)
            txtbox_send.Enabled = true;
        else
            txtbox_send.Enabled = false;
    }
}

}

重定向cmd输出到文本框

您也可以尝试捕获错误数据。

要做到这一点:

在行

之后
p.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);

进入本行

p.ErrorDataReceived += new DataReceivedEventHandler(SortOutputHandler);

这也可能是cmd.exe的问题。

我认为你的问题是OutputDataReceived的使用。在文档中:

在异步读操作期间启用事件StandardOutput。要启动异步读操作,必须执行以下操作重定向Process的StandardOutput流,添加事件OutputDataReceived事件的处理程序,并调用BeginOutputReadLine。此后,OutputDataReceived事件在每次进程结束时发出信号将一行写入重定向的StandardOutput流,直到进程退出或调用CancelOutputRead.

详情请参阅该页的示例代码。

然而,我不确定你是否需要走那条路。您是否尝试过直接从StandardOutput流中读取数据?