我有一个方法可以通过System.Diagnostics.Process启动外部进程,并以字符串形式返回其输出:
public static string ExecuteCommand(string command,string arguments)
{
var processInfo = new System.Diagnostics.ProcessStartInfo(command,arguments));
processInfo.CreateNoWindow = true;
processInfo.RedirectStandardOutput = true;
processInfo.UseShellExecute = false;
string output = "";
var process = System.Diagnostics.Process.Start(processInfo);
while (!process.StandardOutput.EndOfStream)
output += process.StandardOutput.ReadLine() + "\n";
process.WaitForExit();
process.Close();
Debug.Log(output);
return output;
}
这可以正常工作,在执行命令时编辑器没有响应,这可以使用process.WaitForExit()
标志,但是我注意到,当多次调用此函数时,编辑器将保持无响应,直到最后一条命令完成执行。所以,如果我打电话:
ExecuteCommand("adb","install test.apk")
Debug.Log("A")
ExecuteCommand("adb","uninstall com.app.test")
Debug.Log("B")
ExecuteCommand("adb","push file.mp4")
Debug.Log("C")
编辑器冻结,最后一条命令(adb推送)完成执行后,一次打印A,B和C。我可以理解ExecuteCommand方法正在阻塞,但是一旦完成,就不应该控制将其交还Unity Editor并让其在两次调用之间打印调试消息吗?
我该如何解决?我不介意在执行命令时冻结编辑器,但我想给用户一些指示,指示命令运行良好,因为所有命令加在一起可能要花费一些时间。在线一些线程建议使用协程,但这不是我的选择,因为这是一个EditorWindow脚本。