您的位置:首页 > 运维架构 > Shell

Unity调用外部Shell脚本或exe

2016-12-25 22:27 537 查看
有时候项目里需要执行一些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 shell exe cmd bash