/// <summary> /// 执行一段命令 /// </summary> /// <param name="command">命令</param> /// <param name="user">用户类型</param> /// <param name="suCheck">当root执行时,检测su是否存在并根据情况抛出异常</param> /// <returns></returns> public AdvanceOutput Execute(string command, LinuxUser user = LinuxUser.Normal, bool suCheck = true) { lock (exeLock) { outputBuilder.Clear(); if (user == LinuxUser.Su && suCheck && !HaveSu()) { throw new DeviceHaveNoRootException(device); } string shellCommand = user == LinuxUser.Normal ? command : $"su -c \'{command}\'"; string fullCommand = $"{device.ToFullSerial()} shell \"{shellCommand} ; exit $?\""; pStartInfo.Arguments = fullCommand; using (var process = new Process()) { process.StartInfo = pStartInfo; process.OutputDataReceived += (s, e) => { OnOutputReceived(e, false); }; process.ErrorDataReceived += (s, e) => { OnOutputReceived(e, true); }; process.Start(); process.BeginOutputReadLine(); process.BeginErrorReadLine(); ProcessStarted?.Invoke(this, new ProcessStartedEventArgs(process.Id)); process.WaitForExit(); process.CancelErrorRead(); process.CancelOutputRead(); outputBuilder.ExitCode = process.ExitCode; } return(outputBuilder.Result); } }
public MiFlashBatExecuteProcess(string batFileName, DeviceSerialNumber serial) { this.StartInfo = new ProcessStartInfo() { UseShellExecute = false, CreateNoWindow = true, Arguments = $"/q /c {batFileName} {serial.ToFullSerial()}", FileName = "cmd.exe", WorkingDirectory = AdbConstants.toolsPath, RedirectStandardError = true, RedirectStandardOutput = true, }; Logger.Warn(this, $"file path:{StartInfo.Arguments}"); OutputDataReceived += (s, e) => { OutputReceived?.Invoke(this, new OutputReceivedEventArgs(e, false)); }; ErrorDataReceived += (s, e) => { OutputReceived?.Invoke(this, new OutputReceivedEventArgs(e, true)); }; }