跨平台执行命令和脚本的详细方法 净核心
一.导言
在工作中,我们可能会遇到需要在程序中执行一些系统命令来获取一些信息;或者调用一个shell脚本。目前,NET Core可以跨平台执行,那么如何跨平台执行命令呢?请看下面的解释。话不多说,我们来看看详细的介绍
二.进程开始信息和进程类介绍
我们主要使用的两个类是ProcessStartInfo和Process,它们的用法和。NET框架。
1.ProcessStartInfo类
ProcessStartInfo主要设置我们需要创建的流程的一些参数。例如,要启动的应用程序的文件名、参数等。
(1)施工方法
它有三种构造方法:
public ProcessStartInfo();public ProcessStartInfo(字符串文件名);public ProcessStartInfo(字符串fileName,字符串参数);文件名:用于启动进程的应用程序。
参数:进程启动时传递给应用程序的命令行参数。
(2)主要属性
Createnow:指示是否在新窗口中启动进程。
RedirectStandardError:指示应用程序的错误输出是否写入流。
RedirectStandardInput:指示是否从应用程序中读取应用程序的输入流。
RedirectStandardOutput:指示应用程序的文本输出是否写入流。
标准错误编码:错误的输出内容编码。
标准输出编码:文本输出内容的编码。
UseShellExecute:指示是否使用操作系统外壳来启动进程。如果启动进程时使用shell,则为True如果应该直接从可执行文件创建进程,则为False。默认值为真。
这个类没有定义自己的方法,因为它主要设置一些创建流程所需的参数信息。
2.过程类
这个类的主要功能是提供对本地和远程进程的访问,并使您能够启动和停止本地系统进程。
(1).主要属性
ExitCode:获取退出代码。0表示正常,非0表示异常退出。
ExitTime:获取关联进程的退出时间。
开始时间:获取关联进程开始的时间。
HasExited:获取一个值,该值指示相关进程是否已终止。
MachineName:获取运行关联进程的计算机的名称。
SessionId:获取关联进程的终端服务会话标识符。
标准错误:获取读取应用程序错误输出的流。
标准输入:获取应用程序输入内容的流。
标准输出:获取用于读取应用程序文本输出的流。
线程:获取关联进程中正在运行的线程集。
(2).主要方法
开始:开始流程
BeginErrorReadLine:异步开始读取应用程序错误输出。
beginout腐败行:异步开始读取应用程序标准输出。
取消读取:取消读取错误输出。
取消读取标准输出。
关闭:释放与此组件关联的所有资源。
CloseMainWindow:通过向进程的主窗口发送关闭消息,用用户界面关闭进程。
终止:立即停止关联的进程。
刷新:放弃已缓存在进程中的相关进程的任何信息。
WaitForExit:等待相关进程退出。您可以设置超时。如果没有,那就一直等下去。
(3)事件
有三个事件:
ErrorDataReceived:接收到关联进程输出的错误数据。
OutputDataReceived:接收由关联进程输出的标准数据。
已退出:关联的进程退出
在Windows OSX Linux下执行命令
在这里,我选择网络信息。NET Core来输出与。NET Core SDKRuntime。
我们将通过cmd执行接收以下信息:
1.编写代码来执行命令
书面代码如下:
Static void Main(){ //创建一个ProcessStartInfo对象,并使用系统外壳指定命令和参数来设置标准输出var psi=new ProcessStartInfo(' dotnet ','-info '){ redirectstandard output=true };//启动var proc=Process。开始(磅/平方英寸);if (proc==null) { Console。写线('无法执行');} else { Console。WriteLine(' -开始读取标准输出-');//使用(var Sr=proc)开始读取。standardoutput) {while(!sr.EndOfStream) {控制台。write line(Sr . ReadLine());} if(!继续。HasExited) { proc。kill();} }控制台。WriteLine('-Read end-');控制台。WriteLine($ '总执行时间:{(proc。existime-proc。开始时间)。total毫秒{ ms });控制台。WriteLine($)退出代码:{proc。exit code } ');}}执行结果如下:
从执行结果可以看出,除了第一行的提示外,我们通过用编写的程序执行dotnet - info命令得到了几乎相同的结果。我们通过cmd执行命令输出中文,通过程序调用输出英文。有兴趣的朋友可以研究一下这个问题。
2.在Linux上执行
使用的系统环境是CentOS 7.2,以及的版本。NET Core sdk是2.0.3。
直接执行命令的结果如下:
我将代码上传到git服务器,然后在linux上克隆并执行它。结果如下:
可以看出,我们在获取执行输出时没有问题,但是在让流程开始执行时有一个错误,所以无法从流程中检索信息。现在我们删除计算执行时间的代码:
现在我们实施起来没有问题。由此我们可以得出一个结论:由于平台的差异,获取一些信息可能是不正常的,所以我们实际上必须在多个平台上进行测试。
3.在OS X上运行。
我的版本。OSX的NET Core SDK是2.0.0,很久没有更新了。
直接执行命令:
从git Clone代码中,执行结果如下:
可以看出,我们在OSX执行死刑没有问题.
在Windows OSX Linux 1下执行脚本。编写测试脚本
写脚本的主要逻辑是输出程序当前的目录结构,然后输出一句“操作系统类型中的dotnet”
Windows: win.bat
@ echo off direcho ' dotnet in Windows ' Linux : Linux . sh
#!/bin/bashl escho ' dotnet in Linux ' OSX : OSX . sh
#!/bin/bashlescho ' dot net in OSX ' 2。编写测试代码
我把所有的脚本放在项目根目录/shell文件夹中。
因为我们需要根据不同的操作类型选择不同的脚本来执行,所以我们需要判断代码中的操作系统类型。我们可以通过运行时间信息来判断。等平台。
static void Main(){ string FIlename=' shell/';//使用不同的shell文件if(runtimeinformation . isoplatform(osplatform . windows)){ filename=' win . bat ';} else if (RuntimeInformation。isoplatform(OsPlatform。Linux)){ FIlename=' Linux . sh ';} else { fileName=' OSX.sh}//创建一个ProcessStartInfo对象,并使用系统外壳指定命令和参数来设置标准输出var psi=new ProcessStartInfo(filename){ redirectstandard output=true };//启动var proc=Process。开始(磅/平方英寸);if (proc==null) { Console。写线('无法执行');} else { Console。WriteLine(' -开始读取标准输出-');//使用(var Sr=proc)开始读取。standardoutput) {while(!sr.EndOfStream) {控制台。write line(Sr . ReadLine());} if(!继续。HasExited) { proc。kill();} }控制台。WriteLine('-Read end-');控制台。WriteLine($)退出代码:{proc。exit code } ');}}3.在窗口下运行
在windows下运行是完全正常的。
4.在OS X上运行。
直接运行将报告权限异常,如下所示:
使用命令添加执行权限:
Chmod x OSX.sh然后再次执行:
您可以看到脚本已成功执行。
5.在Linux上运行
直接运行也会有权限问题:
还可以使用命令添加执行权限:
Chmod x linux.sh然后再次执行:
您可以看到我们的脚本已经成功执行。
4.容易出错
看到上面的例子,我已经成功实现了。其实我踩了好几个坑,花了很多时间解决。
1.1.sh脚本必须指定一个命令解析器
也就是说,这句话放在sh脚本的开头
#!/bin/bash2。两个windows linux osx脚本编码都必须是ANSI
否则程序执行时,读字符会出现错误,导致执行异常。
动词(verb的缩写)写在最后
希望这篇文章能对你有所帮助。如果你有任何问题,请和我讨论。
本文使用的代码地址:https://github.com/stulzq/BlogDemos/tree/master/DotnetCmd
好了,这就是本文的全部内容。希望本文的内容对你的学习或工作有一定的参考价值。有问题可以留言交流。谢谢你的支持。
版权声明:跨平台执行命令和脚本的详细方法 净核心是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。