在线时间:8:00-16:00
迪恩网络APP
随时随地掌握行业动态
扫描二维码
关注迪恩网络微信公众号
当 Process 将文本写入其标准流中时,通常将在控制台上显示该文本。通过重定向 StandardOutput 流,可以操作或取消进程的输出。例如,可以筛选文本、用不同方式将其格式化,也可以将输出同时写入控制台和指定的日志文件中。有两种方式:同步、异步。
1. 先说同步方法,这种方法网上有很多例子,废话少说,贴上代码大家一看就明白了: Processprocess = new Process(); process.StartInfo.FileName = "cmd.exe"; process.StartInfo.UseShellExecute = false; // 是否使用外壳程序 process.StartInfo.CreateNoWindow = true; //是否在新窗口中启动该进程的值 process.StartInfo.RedirectStandardInput = true; // 重定向输入流 //process.StartInfo.RedirectStandardOutput= true; //重定向输出流 //process.StartInfo.RedirectStandardError= true; //重定向错误流 stringstrCmd = "ping www.163.com /r/n"; strCmd += "exit";
process.Start(); process.StandardInput.WriteLine(strCmd); stringoutput = process.StandardOutput.ReadToEnd();//获取输出信息 process.WaitForExit(); int n =process.ExitCode; // n 为进程执行返回值 process.Close(); 可以同步或异步读取重定向的 StandardOutput 流。Read、ReadLine 和 ReadToEnd 等方法对进程的输出流执行同步读取操作。这些同步读取操作只有在关联的 Process 写入其StandardOutput 流或关闭该流后才能完成。 同步读取操作在读取 StandardOutput 流的调用方及写入该流中的子进程之间引入一个依赖项。这些 依赖项可能导致产生死锁情况。调用方读取子进程的重定向流时依赖于该子进程。调用方将等待读取操作,直到子进程写入流或关闭流为止。子进程写入足够多的数 据以填充重定向流的时间依赖于父进程。子进程将等待下一次写操作,直到父进程读取了全部流或关闭该流为止。当调用方和子进程相互等待对方完成操作时,就会 产生死锁情况,使双方都无法继续执行操作。可以通过计算调用方和子进程之间的依赖项从而避免出现死锁情况。 2. 再来说一下异步方法 使用事件和委托,进程有2个事件OutputDataReceived、OutputDataReceived。
// using System.Diagnostics;
// 运行新进程 ProcessStartInfostartInfo =newProcessStartInfo(exeName); startInfo.CreateNoWindow = true; //不创建窗口 startInfo.UseShellExecute = false;//不使用系统外壳程序启动,重定向输出的话必须设为false startInfo.RedirectStandardOutput = true; //重定向输出,而不是默认的显示在dos控制台上 startInfo.RedirectStandardError = true;
try { Processprocess = Process.Start(startInfo); process.OutputDataReceived += (s, _e)=> Console.WriteLine(_e.Data); process.ErrorDataReceived += (s, _e) =>Console.WriteLine(_e.Data); //当EnableRaisingEvents为true,进程退出时Process会调用下面的委托函数 process.Exited += (s, _e) => Console.WriteLine("Exited with " + _process.ExitCode); process.EnableRaisingEvents = true; process.BeginOutputReadLine(); process.BeginErrorReadLine(); process.WaitForExit(); } catch (Exception e) { Console.WriteLine(ex.Message); }
3. 注意事项 不能对同一个重定向流混合使用异步和同步读取操作。在异步或同步模式下打开 Process 的重定向流后,对该流的所有进一步的读取操作都必须在同一模式下进行。例如,不要对StandardOutput 流调用BeginOutputReadLine 后接着调用ReadLine,反之亦然。但是,可以在不同的模式下读取两个不同的流。例如,可以先调用BeginOutputReadLine,然后再为StandardError 流调用 ReadLine。 |
2023-10-27
2022-08-15
2022-08-17
2022-09-23
2022-08-13
请发表评论