Unity调用外部Shell脚本或exe
2016-12-25 22:27
537 查看
有时候项目里需要执行一些shell脚本,来完成诸如文件移动,命令行打包,自己转换文件
格式什么的工作,省去一些手工劳动,然后这时候就需要用shell了。
网上也有一些关于调用方法的文章,这里就说一下我自己尝试时遇到的问题。
讲到c#里操作进程的方法,那肯定就是
代码如下:
用
因为我是windows环境,且搜到的文章里都是
1
这样的写法,但是经过测试发现,在
但是换成
我手上没有mac的环境,但是感觉把
msdn上查的
若要在启动进程时使用外壳程序,则为 true;否则,直接从可执行文件创建进程。默认为 true。
将此属性设置为 false 使您能够重定向输入流、输出流和错误流。
测试结果:
①,
②,
③,3个重定向的属性为
例如:
所以总结一下就是,那3个重定向属性还是保持默认值就好了,反正往输入流中写参数的方法也不管用,
使用的时候,我们就可以先把自己写的.bat文件读成字符串,然后用上面的RunCommand执行整个bat脚本了。
还可以用RunProcessCommand方法去调用指定的.exe,并为其传递参数了(前提是它能接收参数)
推荐:[实用工具]Unity调用外部EXE或Shell命令
格式什么的工作,省去一些手工劳动,然后这时候就需要用shell了。
网上也有一些关于调用方法的文章,这里就说一下我自己尝试时遇到的问题。
讲到c#里操作进程的方法,那肯定就是
System.Diagnostics.Process这个类没跑了
代码如下:
using UnityEngine; using UnityEditor; using System.Diagnostics; using System.Threading; using System.IO; public class TestRunShell : ScriptableObject { [MenuItem("Menu/RunShell")] public static void RunShell() { // 这里不开线程的话,就会阻塞住unity的主线程,当然如果你需要阻塞的效果的话可以不开 Thread newThread = new Thread(new ThreadStart(RunShellThreadStart)); newThread.Start(); } private static void RunShellThreadStart() { string cmdTxt = @"echo test notepad C:\Users\pc\Desktop\1.txt explorer.exe D:\ pause"; RunCommand(cmdTxt); //RunProcessCommand("notepad", @"C:\Users\pc\Desktop\1.txt"); //RunProcessCommand("explorer.exe", @"D:\"); } private static void RunCommand(string command) { Process process = new Process(); process.StartInfo.FileName = "powershell"; process.StartInfo.Arguments = command; process.StartInfo.CreateNoWindow = false; // 获取或设置指示是否在新窗口中启动该进程的值(不想弹出powershell窗口看执行过程的话,就=true) process.StartInfo.ErrorDialog = true; // 该值指示不能启动进程时是否向用户显示错误对话框 process.StartInfo.UseShellExecute = false; //process.StartInfo.RedirectStandardError = true; //process.StartInfo.RedirectStandardInput = true; //process.StartInfo.RedirectStandardOutput = true; process.Start(); //process.StandardInput.WriteLine(@"explorer.exe D:\"); //process.StandardInput.WriteLine("pause"); process.WaitForExit(); process.Close(); } private static void RunProcessCommand(string command, string argument) { ProcessStartInfo start = new ProcessStartInfo(); start.FileName = command; start.Arguments = argument; start.CreateNoWindow = false; start.ErrorDialog = true; start.UseShellExecute = false; Process p = Process.Start(start); p.WaitForExit(); p.Close(); } }
用
cmd.exe执行的问题
因为我是windows环境,且搜到的文章里都是
process.StartInfo.FileName = "cmd.exe";1
1
这样的写法,但是经过测试发现,在
cmd里能够执行的命令,传不进
cmd.exe里面去,怀疑是不是mono的事,.net下可能就传进去了,这里懒得深究了。。。
但是换成
powershell就可以很顺利的传进去执行。
我手上没有mac的环境,但是感觉把
powershell换成
bash,应该就可以在mac上顺利的执行shell脚本了
ProcessStartInfo的
RedirectStandardError,
RedirectStandardInput,
RedirectStandardOutput属性的设置问题
msdn上查的
UseShellExecute的说明
若要在启动进程时使用外壳程序,则为 true;否则,直接从可执行文件创建进程。默认为 true。
将此属性设置为 false 使您能够重定向输入流、输出流和错误流。
测试结果:
①,
UseShellExecute = false,3个重定向的设置为
true时,打开的shell窗口中,我们就看不到
echo 看我!这样命令的输出结果了。
②,
UseShellExecute = true,他们3个也是
true时,传入的shell脚本不能够运行。
③,3个重定向的属性为
true时,我们并不能用截取输入流的方式往里面传入参数
例如:
process.Start(); process.StandardInput.WriteLine(@"explorer.exe D:\"); process.StandardInput.WriteLine("pause"); process.WaitForExit(); process.Close();
所以总结一下就是,那3个重定向属性还是保持默认值就好了,反正往输入流中写参数的方法也不管用,
使用的时候,我们就可以先把自己写的.bat文件读成字符串,然后用上面的RunCommand执行整个bat脚本了。
还可以用RunProcessCommand方法去调用指定的.exe,并为其传递参数了(前提是它能接收参数)
推荐:[实用工具]Unity调用外部EXE或Shell命令
相关文章推荐
- Unity调用外部EXE或Shell命令
- Unity调用外部EXE或Shell命令
- windows下调用外部exe程序 SHELLEXECUTEINFO
- c++ 调用外部程序exe-ShellExecuteEx
- [Android]Recovery调用外部Shell脚本,Shell脚本使用ui_print方法
- [实用工具]Unity调用外部EXE或Shell命令
- unity调用外部的exe
- Unity调用外部EXE和启动浏览器(手机端也可以启动IE内核)
- Java进程调用外部shell脚本
- 关于unity(c#)调用shell脚本
- Unity C#调用外部exe程序的方法
- Unity 调用外部的EXE和载入关卡
- C#学习(4)——使用shell调用外部exe应用
- windows下调用外部exe程序 SHELLEXECUTEINFO
- Qt下调用外部命令或Shell脚本
- qmake在.pro文件中调用外部脚本或者exe
- 【Delphi-语法函数库】Delphi调用外部EXE文件
- C#调用cmd.exe程序和外部程序
- 关于脚本调用外部对像和类型库
- 使用system调用shell脚本时的返回值的使用