关于.Net中Process和ProcessStartInfor的使用

第一次写博客文章,如果文章内容中有不妥的地方,请多多指教。

到现在为止,关于使用编程语言读写文件的功能已经越来越强大,使用编程语言根据特定的条件生成脚本文件之后需要自动化执行生成的脚本文件应该怎么做

本文主要是介绍在.Net中System.Diagnostics命名空间下Process类和ProcessStartInfo类的使用

用于启动一个外部程序所使用的类是Process,至于ProcessStartInfo类只是用来传入Process类所需要的参数,个人理解是有点类似于适配器的操作,不知道是否正确。

最简单的用于启动一个应用程序

[csharp] view plain copy

Process _proc = new Process();  

ProcessStartInfo _procStartInfo =new ProcessStartInfo("IExplore.exe","http://www.baidu.com");  

_proc.StartInfo = _procStartInfo;  

_proc.Start();  

以上就是简单的使用IE浏览器打开 百度首页 的代码,以上代码等价于

[csharp] view plain copy

    Process _proc = new Process();  

_proc.StartInfo.FileName ="IExplore.exe";  

_proc.StartInfo.Arguments ="http://www.baidu.com";  

        _proc.Start();  

可以通过直接给Process对象的属性赋值而达到相同的效果。

当需要执行一个脚本,比如执行windows系统下的.bat文件该怎么做

我们现在D盘目录下建立一个bat文件,写上内容

[plain] view plain copy

    xcopy /y C:\folder1\1.txt C:\folder2\  

    ping localhost -n 3 >nul  

    xcopy /y C:\folder1\2.txt C:\folder2\  

    ping localhost -n 3 >nul  

    xcopy /y C:\folder1\3.txt C:\folder2\  

脚本内容是把folder1的1.txt,2.txt,3.txt文件赋值到folder2下,在每个赋值命令的中间有ping命令,这是一个用于使一个脚本文件暂定一定时间的比较经典做法/y参数作用是当folder2文件夹下有同名的文件时,不提示而直接覆盖源文件,如果不加上这个参数当有同名的文件时会提示是否覆盖,此处暂停的时间为3秒,>nul 作用是只执行命令而不出现消息内容

新建一个C#文件,写上代码:

[csharp] view plain copy

Process _proc = new Process();  

ProcessStartInfo _procStartInfo =new ProcessStartInfo();  

_procStartInfo.FileName = @"C:/Test.bat";  

_procStartInfo.CreateNoWindow =true;  

_procStartInfo.UseShellExecute =false;  

_procStartInfo.RedirectStandardOutput =true;  

 _proc.StartInfo = _procStartInfo;  

 _proc.Start();  

 _proc.WaitForExit(1000);  

 _proc.Kill();  

using (StreamReader sr = _proc.StandardOutput) {  

     String str = sr.ReadLine();  

while (null != str) {  

         Console.WriteLine(str);  

         str = sr.ReadLine();  

     }  

 }  

if (_proc.HasExited)  

     _proc.Close();  

此处提到三个属性:

CreateNoWindow:表示是否启动新的窗口来执行这个脚本,默认值为false,既不会开启新的窗口,当main线程运行完时,启动的控制台无法结束,需要等待脚本执行完毕才能继续,当手动设置为true,即脚本在后台新窗口执行(本人目前没有找到显示该新窗口的方法,如有悉者,敬请告知),main线程运行结束之后不必等待脚本执行完毕即可正常关闭,此时脚本在后台继续执行直至自动结束,往下看可以看到Process类的成员方法WaitForExit(int time)和Kill()方法,WaitForExit(int time)用于在time(毫秒)时间内等待脚本执行,当超过这个时间,main继续往下执行,脚本后台运行直至结束,如果不添加time参数,则无休止等待直至脚本运行完毕,Kill()方法用于停止该脚本的运行。由前面可以看出脚本总共需要至少6秒钟的时间,此时WaitForExit()参数设置为1000,则一秒之后,main函数不再等待脚本执行,此时查看folder2文件夹,发现复制了一个1.txt文件,然后运行kill()方法,脚本直接被终止,如果注释Kill()方法,则脚本会自动运行6秒之后自动停止。

UseShellExecute:是否使用外壳来运行程序,设置为true时运行程序会弹出新的cmd窗口执行脚本文件。当设置为false时则不使用外壳程序来运行。默认值为true

RedirectStandardOutput:获取对象的标准输出流StreamReader对象,用于输出脚本的返回内容,当该属性设置为true,则UseShellExecute属性必须设置为false,当加上外壳程序运行时,弹出新的窗口运行内容就是StandardOutput的读取内容。

除此之外还有RedirectStandardInput属性,可以用于默认人为输入命令。

运行完之后Process的HasExited属性可以判断脚本是否运行完毕。

至此,本人对Process类的基本运用的拙见如上所述,有问题可以多多交流。

晚辈第一次发技术博客,请大家多多担待,如有不妥之处,敬请斧正。

你可能感兴趣的:(关于.Net中Process和ProcessStartInfor的使用)