process重定向并输出到richtextbox的范例

网上找了一些重定向的讲的都不详细,来个干货,不仅可以执行bat,还可以输出到richtextbox中,用回调的方式不卡顿,结束有标记,可供其他事件触发使用。

 1、用button来触发下面的事件

rtb_LogOut.Text = string.Empty;
            using (Process process = new Process())
            {
               
                process.StartInfo.FileName = @"flashDown\jlink.bat";
                process.StartInfo.Arguments = string.Format("10");//this is argument
                process.StartInfo.CreateNoWindow = true;
                //将此属性设置为 false 使您能够重定向输入流、输出流和错误流。
                //使用操作系统 shell 启动进程时,可以使用 Process 组件启动任何文档(可以是与可执行文件关联的、具有默认打开操作的任何注册文件类型),并对该文件执行操作(如打印)。 如果 UseShellExecute 为 false,则只能使用 Process 组件启动可执行文件。
                process.StartInfo.UseShellExecute = false;
                process.StartInfo.RedirectStandardOutput = true;
                process.StartInfo.RedirectStandardInput = true;
                process.StartInfo.RedirectStandardError = true;
                process.ErrorDataReceived += processDlmd_ErrorDataReceived;
                process.OutputDataReceived += processDlmd_OutputDataReceived;
                process.Start();
                process.BeginOutputReadLine();
                process.BeginErrorReadLine();

                //int wCnt = 0;
                //while (process.HasExited == false && wCnt < 210 && BlkDlsFm.menualEnd[mi] == false)
                //{
                //    Thread.Sleep(2000);
                //    wCnt++;
                //}

                //process.WaitForExit(420 * 1000);

                process.WaitForExit(10000);//定义最大超时时间

             
                if (!process.HasExited)
                    process.Kill();
             messagebox.show("结束啦!");

2、写两个回调函数

  private void processDlmd_OutputDataReceived(object sender, DataReceivedEventArgs e)//回调函数OutputDataReceived
        {
             getStr = e.Data;
            if (getStr == null) return;

            if (getStr.Contains("__Dload9x15_Status_:"))
            {
                if (getStr.Contains("__Dload9x15_Status_:OK"))
                {
                    cmdRetOk = true;
                }
                else
                {
                    cmdRetOk = false;
                }
                cmdHasEnd = true;
                return;
            }
            addLog();
        }
         
        private void processDlmd_ErrorDataReceived(object sender, DataReceivedEventArgs e) //回调函数ErrorDataReceived
        {
             getStr = e.Data;
            if (getStr == null) return;

            if (getStr.Contains("__Dload9x15_Status_:"))
            {
                if (getStr.Contains("__Dload9x15_Status_:OK"))
                {
                    cmdRetOk = true;
                }
                else
                {
                    cmdRetOk = false;
                }
                cmdHasEnd = true;
                return;
            }
            addLog();
        }
      3、这是把log内容加入文本的函数

  private void addLog()
        {
            //showLog(getStr);
            // LogBuilder.AppendLine(getStr);
            rtb_LogOut.AppendText(getStr + "\r\n");
            rtb_LogOut.Select(rtb_LogOut.TextLength, 0);//光标定位到文本最后
            rtb_LogOut.ScrollToCaret();//滚动到光标处
        }
 

猜你喜欢

转载自blog.csdn.net/u014194297/article/details/84816774