重定向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;
}
}
}
您也可以尝试捕获错误数据。
要做到这一点:
在行
之后p.OutputDataReceived += new DataReceivedEventHandler(SortOutputHandler);
进入本行
p.ErrorDataReceived += new DataReceivedEventHandler(SortOutputHandler);
这也可能是cmd.exe
的问题。
我认为你的问题是OutputDataReceived
的使用。在文档中:
在异步读操作期间启用事件StandardOutput。要启动异步读操作,必须执行以下操作重定向Process的StandardOutput流,添加事件OutputDataReceived事件的处理程序,并调用BeginOutputReadLine。此后,OutputDataReceived事件在每次进程结束时发出信号将一行写入重定向的StandardOutput流,直到进程退出或调用CancelOutputRead.
详情请参阅该页的示例代码。
然而,我不确定你是否需要走那条路。您是否尝试过直接从StandardOutput流中读取数据?