网上找了一些重定向的讲的都不详细,来个干货,不仅可以执行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();//滚动到光标处
}