当前位置: 首页 > 编程语言 > C#

C#WindowsForm.NetandDOSConsole分享

时间:2023-04-11 00:43:16 C#

C#WindowsForm.NetandDOSConsole我有一个执行批处理文件的WindowsForm。我想将我的控制台中发生的一切都移动到我的表单中的面板中。我怎样才能做到这一点?我的DOS控制台如何与我的Windows窗体面板通信???谢谢您可以从Form应用程序调用DOS或批处理程序并将输出重定向到字符串:p.StartInfo.RedirectStandardOutput=true;p.StartInfo.FileName=PathToBatchFile;p.StartInfo.Arguments=args;p.开始();字符串o=p.StandardOutput.ReadToEnd();p.WaitForExit();}文档指出,如果你想同时读取StandardError和StandardOutput,则需要异步读取其中一个以避免死锁。此外,如果您在重定向流之一上调用ReadToEnd,则必须在调用WaitForExit()之前执行此操作。如果在ReadToEnd之前有WaitForExit,输出缓冲区可能会填满,从而停止进程,这意味着它永远不会退出。那将是漫长的等待。这也在文档中!示例:字符串输出;字符串错误;System.Diagnostics.Processp=newSystem.Diagnostics.Process{StartInfo={FileName=program,Arguments=args,WindowStyle=System.Diagnostics.ProcessWindowStyle.Hidden,UseShellExecute=false,}};if(waitForExit){StringBuildersb=newStringBuilder();p.StartInfo.RedirectStandardOutput=true;p.StartInfo.RedirectStandardError=true;动作stdErrorRead=(o,e)=>{if(!String.IsNullOrEmpty(e.Data))sb.Append(e.Data);};p.ErrorDataReceived+=stdErrorRead;p.开始();//开始异步读取stderrp.BeginErrorReadLine();//同步读取标准输出output=p.StandardOutput.ReadToEnd();p.WaitForExit();//返回代码在p.ExitCode中if(sb.Length>0)error=sb.ToString();您应该先添加对System.Diagnostics的引用,然后再调用批处理文件,如下所示:stringmyFile="c:\path\to\batch_file.bat";ProcessStartInfopsi=newProcessStartInfo(myFile);psi.UseShellExecute=false;psi.CreateNoWindow=true;附言i.RedirectStandardOutput=true;Processproc=Process.Start(psi);现在,如果您希望阻止调用(IE,您的应用程序将冻结直到文件完成),然后只需使用stringresult=proc.StandardOutput.ReadToEnd()来读取整个批处理文件的输出。但是,如果您希望应用程序继续响应并实时显示输出,则需要使用BeginOutputReadLine。我一直在使用System.Diagnostics.Process类来调用基于控制台的应用程序以及格式化和返回输出。我认为它也适用于批处理文件。我会花时间测试一下。以下是一些示例代码:System.Diagnostics.ProcessStartInfostart=newSystem.Diagnostics.ProcessStartInfo();开始.UseShellExecute=false;开始.RedirectStandardInput=true;start.WindowStyle=System.Diagnostics.ProcessWindowStyle.Hidden;开始.RedirectStandardOutput=true;start.FileName="在";System.Diagnostics.ProcessmyP=System.Diagnostics.Process.Start(开始);字符串strOutput=myP.StandardOutput.ReadToEnd();if(strOutput.Contains("列表中没有条目。")){litMsg.Text="没有工作";}else{strOutput=strOutput.Replace("r","");foreach(StringlineinstrOutput.Split("n".ToCharArray())){//(0,7)(7,5)(12,24)(36,14)(50,)//状态ID日时间命令行//--------------------------------------------------------------------------//1明天凌晨3:00dir*if(line.Length>50){字符串状态=line.Substring(0,7);字符串ID=line.Substring(7,5);StringDay=line.Substring(12,24);字符串时间=line.Substring(35,14);字符串命令=line.Substring(49);我最近构建了一个小应用程序,我在其中与批处理文件进行交互我发现这个代码片段允许我这样做:Processproc=newProcess{StartInfo={RedirectStandardError=true,RedirectStandardOutput=true,UseShellExecute=false,}};proc.开始();stringerrorMessage=proc.StandardError.ReadToEnd();proc.WaitForExit();字符串outputMessage=proc.StandardOutput.ReadToEnd();proc.WaitForExit();从这里,只需将这些字符串指向您选择的用户控件。编辑注意:这不是通用解决方案。它可能导致死锁。来自RedirectStandardError的文档:同步读取操作在从StandardError流读取的调用者和写入该流的子进程之间引入了依赖关系。这些依赖关系会导致死锁情况。当调用者从子进程的重定向流中读取时,它取决于子进程。调用者等待读取操作,直到子进程写入流或关闭流。当子进程写入足够的数据来填充其重定向流时,它依赖于父进程。子进程等待下一个写操作,直到父进程从完整的流中读取或关闭流。当调用者和子进程相互等待对方完成操作,但都无法继续时,就会出现死锁情况。您可以通过评估调用者和子进程之间的依赖关系来避免死锁。我很确定有更好的选择,但您可以将命令的输出路由到一个临时文件将命令行输出重定向到一个文件对于显示大量文本的程序,考虑重定向通常显示在stdout上的文本到一个文件。显示大量文本会减慢执行速度;在工作站的终端窗口中滚动文本会导致I/O瓶颈(增加运行时间)并占用更多CPU时间。以下命令显示如何通过将输出重定向到文件然后显示程序输出来更有效地运行程序:myprog>results.lismoreresults.lis由于屏幕I/欧。我想你也可以将它路由到一个变量,但不是100%确定。可能有更好的选择,但至少这是一个。以上就是C#学习教程:C#WindowsForm.NetandDOSconsole分享的全部内容。如果对你有用,需要进一步了解C#学习教程,希望大家多多关注。本文收集自网络,不代表立场,如涉及侵权,请点击右边联系管理员删除。如需转载请注明出处: