这下我们执行就没有问题了。从这里我们可以得出结论:由于平台的差异,获取一些信息可能会出现异常,所以我们实际一定要在多个平台上测试。
3.在OSX上运行
我在OSX上的.NET Core SDK版本为2.0.0 很久没更新了。
直接执行命令:
从git Clone代码,执行结果如下:
可以看出我们在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 文件夹下。
因为我们需要根据不同的操作类型,选择不同的脚本来进行执行,所以我们需要在代码里面判断一下操作系统类型。我们可以通过 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下运行
在windows下运行是完全正常的。
4.在OSX运行
直接运行会报一个权限异常,如下:
使用命令加入执行权限:
chmod +x OSX.sh
然后再次执行:
可以看到成功执行了脚本。
5.在Linux上运行
直接运行也是会有权限问题的:
同样使用命令加入执行权限:
chmod +x linux.sh
然后再次执行:
可以看到成功执行了我们的脚本。
4.容易犯的错误
看见上面的例子,我都成功执行了,其实我踩了几个坑,花了我不少时间来解决。
1.sh脚本一定要指定命令解析器
也就是这句话,放在sh脚本开头
#!/bin/bash
2.不管是windows linux osx 脚本编码必须为 ANSI
不然程序执行的时候,读取字符会出错,造成执行异常。
五.写在最后
希望本文能给大家带来帮助,如有问题欢迎和我讨论。
本文所用代码地址:https://github.com/stulzq/BlogDemos/tree/master/DotnetCmd