Unity调用外部Shell脚本或exe

有时候项目里需要执行一些shell脚本,来完成诸如文件移动,命令行打包,自己转换文件
格式什么的工作,省去一些手工劳动,然后这时候就需要用shell了。
网上也有一些关于调用方法的文章,这里就说一下我自己尝试时遇到的问题。


讲到c#里操作进程的方法,那肯定就是System.Diagnostics.Process这个类没跑了

代码如下:

01.using UnityEngine;  
02.using UnityEditor;  
03.using System.Diagnostics;  
04.using System.Threading;  
05.using System.IO;  
06.  
07.public class TestRunShell : ScriptableObject  
08.{  
09.    [MenuItem("Menu/RunShell")]  
10.    public static void RunShell()  
11.    {  
12.        // 这里不开线程的话,就会阻塞住unity的主线程,当然如果你需要阻塞的效果的话可以不开  
13.        Thread newThread = new Thread(new ThreadStart(RunShellThreadStart));  
14.        newThread.Start();  
15.    }  
16.  
17.    private static void RunShellThreadStart()  
18.    {  
19.        string cmdTxt = @"echo test  
20.notepad C:\Users\pc\Desktop\1.txt  
21.explorer.exe D:\  
22.pause";  
23.  
24.        RunCommand(cmdTxt);  
25.        //RunProcessCommand("notepad", @"C:\Users\pc\Desktop\1.txt");  
26.        //RunProcessCommand("explorer.exe", @"D:\");  
27.    }  
28.  
29.    private static void RunCommand(string command)  
30.    {  
31.        Process process = new Process();  
32.        process.StartInfo.FileName = "powershell";  
33.        process.StartInfo.Arguments = command;  
34.  
35.        process.StartInfo.CreateNoWindow = false; // 获取或设置指示是否在新窗口中启动该进程的值(不想弹出powershell窗口看执行过程的话,就=true)  
36.        process.StartInfo.ErrorDialog = true; // 该值指示不能启动进程时是否向用户显示错误对话框  
37.        process.StartInfo.UseShellExecute = false;  
38.        //process.StartInfo.RedirectStandardError = true;  
39.        //process.StartInfo.RedirectStandardInput = true;  
40.        //process.StartInfo.RedirectStandardOutput = true;  
41.  
42.        process.Start();  
43.  
44.        //process.StandardInput.WriteLine(@"explorer.exe D:\");  
45.        //process.StandardInput.WriteLine("pause");  
46.  
47.        process.WaitForExit();  
48.        process.Close();  
49.    }  
50.  
51.    private static void RunProcessCommand(string command, string argument)  
52.    {  
53.        ProcessStartInfo start = new ProcessStartInfo();  
54.        start.FileName = command;  
55.        start.Arguments = argument;  
56.  
57.        start.CreateNoWindow = false;  
58.        start.ErrorDialog = true;  
59.        start.UseShellExecute = false;  
60.  
61.        Process p = Process.Start(start);  
62.        p.WaitForExit();  
63.        p.Close();  
64.    }  
65.}  

用 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时,我们并不能用截取输入流的方式往里面传入参数
例如:

01.process.Start();  
02.process.StandardInput.WriteLine(@"explorer.exe D:\");  
03.process.StandardInput.WriteLine("pause");  
04.process.WaitForExit();  
05.process.Close();  

所以总结一下就是,那3个重定向属性还是保持默认值就好了,反正往输入流中写参数的方法也不管用,
使用的时候,我们就可以先把自己写的.bat文件读成字符串,然后用上面的RunCommand执行整个bat脚本了。
还可以用RunProcessCommand方法去调用指定的.exe,并为其传递参数了(前提是它能接收参数)

推荐:http://blog.csdn.net/kakashi8841/article/details/44998241

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 199,830评论 5 468
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 83,992评论 2 376
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 146,875评论 0 331
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 53,837评论 1 271
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 62,734评论 5 360
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,091评论 1 277
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,550评论 3 390
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,217评论 0 254
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,368评论 1 294
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,298评论 2 317
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,350评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,027评论 3 315
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,623评论 3 303
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,706评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,940评论 1 255
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,349评论 2 346
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 41,936评论 2 341

推荐阅读更多精彩内容