166 lines
5.3 KiB
C#
166 lines
5.3 KiB
C#
|
|
using System.Diagnostics;
|
|
using UnityEngine;
|
|
using System.Collections;
|
|
using System.Collections.Generic;
|
|
using System.Reflection;
|
|
using System.IO;
|
|
using System.Threading;
|
|
using System.Linq;
|
|
|
|
namespace zbitmapfont
|
|
{
|
|
public class CommandLineTool
|
|
{
|
|
public static int ERROR_TIMEOUT = 1111111;
|
|
|
|
public static int RunCommand(string workingDir, string program, string[] args, bool log = true)
|
|
{
|
|
using (Process p = new Process())
|
|
{
|
|
p.StartInfo.WorkingDirectory = workingDir;
|
|
p.StartInfo.FileName = program;
|
|
p.StartInfo.UseShellExecute = false;
|
|
p.StartInfo.CreateNoWindow = true;
|
|
string argsStr = string.Join(" ", args.Select(arg => "\"" + arg + "\""));
|
|
p.StartInfo.Arguments = argsStr;
|
|
if (log)
|
|
{
|
|
UnityEngine.Debug.Log($"[BashUtil] run => {program} {argsStr}");
|
|
}
|
|
p.Start();
|
|
p.WaitForExit();
|
|
return p.ExitCode;
|
|
}
|
|
}
|
|
|
|
|
|
public static (int ExitCode, string StdOut, string StdErr) RunCommand2(string program, string args, string workingDir, bool log = true)
|
|
{
|
|
return CmdExWithOutput(program, args, workingDir);
|
|
|
|
}
|
|
|
|
|
|
public static (int exitCode, string stdOut, string stdErr) CmdExWithOutput(string command, string arguments, string workDir, IDictionary<string, string> envVars = null)
|
|
{
|
|
string output;
|
|
string outputError;
|
|
|
|
int i = 0;
|
|
while (i < 5)
|
|
{
|
|
i++;
|
|
Process p = new Process();
|
|
p.StartInfo.FileName = command;
|
|
p.StartInfo.Arguments = arguments;
|
|
p.StartInfo.WorkingDirectory = workDir;
|
|
p.StartInfo.UseShellExecute = false;
|
|
|
|
if (envVars != null)
|
|
{
|
|
foreach (var entry in envVars)
|
|
{
|
|
if (p.StartInfo.EnvironmentVariables.ContainsKey(entry.Key))
|
|
{
|
|
p.StartInfo.EnvironmentVariables[entry.Key] = entry.Value;
|
|
}
|
|
else
|
|
{
|
|
p.StartInfo.EnvironmentVariables.Add(entry.Key, entry.Value);
|
|
}
|
|
}
|
|
}
|
|
if (p.StartInfo.UseShellExecute)
|
|
{
|
|
// p.StartInfo.RedirectStandardError=false;
|
|
// p.StartInfo.RedirectStandardOutput=false;
|
|
// p.StartInfo.RedirectStandardInput=false;
|
|
}
|
|
else
|
|
{
|
|
p.StartInfo.RedirectStandardError = true;
|
|
p.StartInfo.RedirectStandardOutput = true;
|
|
|
|
}
|
|
|
|
p.StartInfo.CreateNoWindow = true;
|
|
p.StartInfo.ErrorDialog = true;
|
|
p.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
|
|
p.StartInfo.StandardOutputEncoding = System.Text.Encoding.UTF8;
|
|
p.StartInfo.StandardErrorEncoding = System.Text.Encoding.UTF8;
|
|
p.Start();
|
|
|
|
string outStr = "";
|
|
if (true)
|
|
{
|
|
try
|
|
{
|
|
|
|
p.OutputDataReceived += (o, ar) =>
|
|
{ outStr += ar.Data + "\n"; };
|
|
p.BeginOutputReadLine();
|
|
//System.Text.StringBuilder outputBuilder = new System.Text.StringBuilder();
|
|
//while (!p.StandardOutput.EndOfStream)
|
|
//{
|
|
// string line = p.StandardOutput.ReadLine();
|
|
// outputBuilder.AppendLine(line);
|
|
//}
|
|
|
|
//output = outputBuilder.ToString();
|
|
}
|
|
catch (System.Exception e)
|
|
{
|
|
output = e.Message;
|
|
}
|
|
}
|
|
//else
|
|
//{
|
|
// if(!p.WaitForExit(10000))
|
|
// {
|
|
// if(i >= 5)
|
|
// {
|
|
// return ERROR_TIMEOUT;
|
|
// }
|
|
|
|
// Thread.Sleep(2000);
|
|
// continue;
|
|
// }
|
|
//}
|
|
|
|
string errOut = "";
|
|
try
|
|
{
|
|
|
|
p.ErrorDataReceived += (o, ar) =>
|
|
{
|
|
errOut += ar.Data + "\n";
|
|
};
|
|
p.BeginErrorReadLine();
|
|
|
|
//outputError = p.StandardError.ReadToEnd();
|
|
}
|
|
catch (System.Exception e)
|
|
{
|
|
outputError = e.Message;
|
|
}
|
|
|
|
//while (!p.HasExited)
|
|
//{
|
|
// continue;
|
|
//}
|
|
|
|
p.WaitForExit();
|
|
|
|
output = outStr;
|
|
outputError = errOut;
|
|
|
|
return (p.ExitCode, outStr, errOut);
|
|
|
|
}
|
|
|
|
return (ERROR_TIMEOUT, null, null);
|
|
}
|
|
}
|
|
}
|