You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

129 lines
3.7 KiB

using System;
using System.Diagnostics;
using System.Collections.Generic;
using System.Threading;
using System.Threading.Tasks;
namespace ET
{
public static class ShellHelper
{
private static string shellApp
{
get
{
#if UNITY_EDITOR_WIN
string app = "cmd.exe";
#elif UNITY_EDITOR_OSX
string app = "bash";
#endif
return app;
}
}
private static volatile bool isFinish;
public static void Run(string cmd, string workDirectory, List<string> environmentVars = null)
{
Process p = null;
try
{
ProcessStartInfo start = new ProcessStartInfo(shellApp);
#if UNITY_EDITOR_OSX
string splitChar = ":";
start.Arguments = "-c";
#elif UNITY_EDITOR_WIN
string splitChar = ";";
start.Arguments = "/c";
#endif
if (environmentVars != null)
{
foreach (string var in environmentVars)
{
start.EnvironmentVariables["PATH"] += (splitChar + var);
}
}
start.Arguments += (" \"" + cmd + "\"");
start.CreateNoWindow = true;
start.ErrorDialog = true;
start.UseShellExecute = false;
start.WorkingDirectory = workDirectory;
if (start.UseShellExecute)
{
start.RedirectStandardOutput = false;
start.RedirectStandardError = false;
start.RedirectStandardInput = false;
}
else
{
start.RedirectStandardOutput = true;
start.RedirectStandardError = true;
start.RedirectStandardInput = true;
start.StandardOutputEncoding = System.Text.Encoding.UTF8;
start.StandardErrorEncoding = System.Text.Encoding.UTF8;
}
Barrier barrier = new Barrier(2);
// 放到新线程启动进程,主线程循环读标准输出,直到进程结束
Task.Run(() =>
{
p = Process.Start(start);
barrier.RemoveParticipant();
p.WaitForExit();
isFinish = true;
});
// 这里要等待进程启动才能往下走,否则p将为null
barrier.SignalAndWait();
do
{
string line = p.StandardOutput.ReadLine();
if (string.IsNullOrEmpty(line))
{
break;
}
line = line.Replace("\\", "/");
UnityEngine.Debug.Log(line);
}
while (!isFinish);
bool hasError = false;
while (true)
{
string error = p.StandardError.ReadLine();
if (string.IsNullOrEmpty(error))
{
break;
}
hasError = true;
UnityEngine.Debug.LogError(error);
}
p.Close();
if (hasError)
{
UnityEngine.Debug.LogError("has error!");
}
}
catch (Exception e)
{
UnityEngine.Debug.LogException(e);
if (p != null)
{
p.Close();
}
}
}
}
}