.NET Core跨平台执行命令、脚本的方法详细(2)

这下我们执行就没有问题了。从这里我们可以得出结论:由于平台的差异,获取一些信息可能会出现异常,所以我们实际一定要在多个平台上测试。

3.在OSX上运行

我在OSX上的.NET Core SDK版本为2.0.0 很久没更新了。

直接执行命令:

.NET Core跨平台执行命令、脚本的方法详细

从git Clone代码,执行结果如下:

.NET Core跨平台执行命令、脚本的方法详细

可以看出我们在OSX上执行是没有问题的。

四.在Windows OSX Linux 下执行脚本1.编写测试脚本

编写脚本的主要逻辑为输出程序当前目录结构,然后输出一句话 “dotnet in 操作系统类型”

Windows: win.bat

@echo off dir echo "dotnet in Windows"

Linux: linux.sh

#!/bin/bash ls echo "dotnet in Linux"

OSX: OSX.sh

#!/bin/bash ls echo "dotnet in OSX"

2.编写测试代码

我将所有的脚本都放在 项目根目录/shell 文件夹下。

.NET Core跨平台执行命令、脚本的方法详细

因为我们需要根据不同的操作类型,选择不同的脚本来进行执行,所以我们需要在代码里面判断一下操作系统类型。我们可以通过 RuntimeInformation.IsOSPlatform来判断。

static void Main() { string fileName="shell/"; //根据系统使用不同的shell文件 if (RuntimeInformation.IsOSPlatform(OSPlatform.Windows)) { fileName += "win.bat"; } else if (RuntimeInformation.IsOSPlatform(OSPlatform.Linux)) { fileName += "linux.sh"; } else { fileName += "OSX.sh"; } //创建一个ProcessStartInfo对象 使用系统shell 指定命令和参数 设置标准输出 var psi = new ProcessStartInfo(fileName) { RedirectStandardOutput = true }; //启动 var proc = Process.Start(psi); if (proc == null) { Console.WriteLine("Can not exec."); } else { Console.WriteLine("-------------Start read standard output--------------"); //开始读取 using (var sr = proc.StandardOutput) { while (!sr.EndOfStream) { Console.WriteLine(sr.ReadLine()); } if (!proc.HasExited) { proc.Kill(); } } Console.WriteLine("---------------Read end------------------"); Console.WriteLine($"Exited Code : {proc.ExitCode}"); } }

3.在Windows下运行

.NET Core跨平台执行命令、脚本的方法详细

在windows下运行是完全正常的。

4.在OSX运行

直接运行会报一个权限异常,如下:

.NET Core跨平台执行命令、脚本的方法详细

使用命令加入执行权限:

chmod +x OSX.sh

然后再次执行:

.NET Core跨平台执行命令、脚本的方法详细

可以看到成功执行了脚本。

5.在Linux上运行

直接运行也是会有权限问题的:

.NET Core跨平台执行命令、脚本的方法详细

同样使用命令加入执行权限:

chmod +x linux.sh

然后再次执行:

.NET Core跨平台执行命令、脚本的方法详细

可以看到成功执行了我们的脚本。

4.容易犯的错误

看见上面的例子,我都成功执行了,其实我踩了几个坑,花了我不少时间来解决。

1.sh脚本一定要指定命令解析器

也就是这句话,放在sh脚本开头

#!/bin/bash

2.不管是windows linux osx 脚本编码必须为 ANSI

不然程序执行的时候,读取字符会出错,造成执行异常。

五.写在最后

希望本文能给大家带来帮助,如有问题欢迎和我讨论。

本文所用代码地址:https://github.com/stulzq/BlogDemos/tree/master/DotnetCmd

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wdsswj.html