using System.Diagnostics; namespace Tiobon.PublishHelper { /// /// CmdHelper /// public class CmdHelper { /// /// 指令Cmd命令 /// /// /// public static (bool, string) ExecCmd(string str) { string msg = string.Empty; bool hasError = false; bool completed = false; string cmdCur = string.Empty; using (Process m_Cmd = new Process()) { m_Cmd.StartInfo.FileName = "cmd.exe"; m_Cmd.StartInfo.WorkingDirectory = "."; m_Cmd.StartInfo.UseShellExecute = false; m_Cmd.StartInfo.RedirectStandardInput = true; m_Cmd.StartInfo.RedirectStandardOutput = true; m_Cmd.StartInfo.CreateNoWindow = true; m_Cmd.OutputDataReceived += new DataReceivedEventHandler((sender, e) => { if (!string.IsNullOrEmpty(e.Data)) { var res = e.Data; if (res.Contains("\u001b")) { foreach (System.Text.RegularExpressions.Match item in Utility.m_RegexUb.Matches(res)) { res = res.Replace(item.Value, ""); } } Utility.SendLog("", res); if (res.Trim() != "Unable to use package assets cache due to I/O error. This can occur when the same project is built more than once in parallel. Performance may be degraded, but the build result will not be impacted." && (res.Contains("ERR!") || res.Contains("ERROR") || res.Contains("error"))) { msg = res; hasError = true; } if (res.EndsWith("exit")) { completed = true; } } }); m_Cmd.Start(); m_Cmd.BeginOutputReadLine(); str.Split(new char[] { '\r', '\n' }, StringSplitOptions.RemoveEmptyEntries) .ToList() .ForEach(s => { if (hasError) return; cmdCur = s; m_Cmd.StandardInput.WriteLine(cmdCur); }); int timecout = 60 * 15; while (!completed && !hasError) { System.Threading.Thread.Sleep(1000); if (--timecout < 0) { msg = $"指令执行超时:{str}"; hasError = true; break; } } } return (hasError, msg); } } }