C# 如何在后台启动批处理文件并重定向其输出?

C# 如何在后台启动批处理文件并重定向其输出?,c#,C#,我试图从应用程序调用批处理文件,但我希望隐藏命令窗口,并将标准输出重定向到一个或多个位置(因为它是由批处理文件生成的) 我的问题是,当批处理文件运行时,控制台启动,没有显示任何内容;刚刚好。任务完成后,控制台关闭。我想摆脱控制台(也许让它在后台运行) 另一个问题是,我将输出重定向到richtext框。如果我将其重定向到控制台或文本框,它只会一次输出所有结果。我希望它在发生的时候一行一行地吐出来。有道理吗 代码如下: //Declare and instantiate a new proc

我试图从应用程序调用批处理文件,但我希望隐藏命令窗口,并将标准输出重定向到一个或多个位置(因为它是由批处理文件生成的)

我的问题是,当批处理文件运行时,控制台启动,没有显示任何内容;刚刚好。任务完成后,控制台关闭。我想摆脱控制台(也许让它在后台运行)

另一个问题是,我将输出重定向到richtext框。如果我将其重定向到控制台或文本框,它只会一次输出所有结果。我希望它在发生的时候一行一行地吐出来。有道理吗

代码如下:

    //Declare and instantiate a new process component.
    System.Diagnostics.Process process1;
    process1 = new System.Diagnostics.Process();
    process1.StartInfo.UseShellExecute = false;
    process1.StartInfo.RedirectStandardOutput = true;
    process1.StartInfo.FileName = "cmd.exe";
    process1.StartInfo.Arguments = "<BATCHfILE>";
    process1.Start();

    string output = process1.StandardOutput.ReadToEnd();
    rchsdtOut.Text = output;

    Console.WriteLine(process1.StandardOutput.ReadToEnd());

    process1.WaitForExit();
    process1.Close();
//声明并实例化新的流程组件。
系统诊断过程1;
process1=新的System.Diagnostics.Process();
process1.StartInfo.UseShellExecute=false;
process1.StartInfo.RedirectStandardOutput=true;
process1.StartInfo.FileName=“cmd.exe”;
process1.StartInfo.Arguments=“”;
process1.Start();
字符串输出=process1.StandardOutput.ReadToEnd();
rchsdtOut.Text=输出;
Console.WriteLine(process1.StandardOutput.ReadToEnd());
process1.WaitForExit();
process1.Close();

我会这样做的。希望我正确理解了你的问题:

加:

然后是一种方法

private void myMethod(DataReceivedEventArgs e)
{
    //Do something with e.Data
}
解决评论中提到的跨线程操作问题。您需要将其添加到表单类中(在函数开始之前):

然后您需要添加以下内容:

private void update_richTextBox1(string value)
{
    richTextBox1.Text += value;
}
然后在myMethod函数中添加:

richTextBox1.Invoke(new updateText(update_richTextBox1), new object[] { e.Data.ToString() });

你刚才说的也是,但它不是逐行在dos控制台live上打印事件,而是一块一块地写。对不起,我弄错了。我现在只是想让它写入控制台,但它什么也没写。Console.WriteLine(如Data.ToString());很抱歉,您还需要添加process1.BeginOutputReadLine();就在process1.Start()之后,但在process1.WaitForExit()之前;好的,当我编写控制台时,这似乎很有效。假设我想将其写入富文本框。我在myMethod rchstdOut.text=e.Data.ToString()中使用了以下代码;问题是Visual Studio指责{“跨线程操作无效:控件'rchsdtOut'是从创建它的线程以外的线程访问的。”}好的,用一种方法更新了我的答案以解决此问题。只是从我的头顶,所以希望我得到它的权利。如果没有,请接受此作为答案,并为此单独创建一个新问题,我相信您会很快得到帮助。
private void update_richTextBox1(string value)
{
    richTextBox1.Text += value;
}
richTextBox1.Invoke(new updateText(update_richTextBox1), new object[] { e.Data.ToString() });