/// <summary> /// 执行 /// </summary> /// <returns></returns> public virtual IProcessBasedCommandResult Execute() { lock (executeLock) { outputBuilder.Clear(); int retCode = -1; using (process = Process.Start(processStartInfo)) { process.OutputDataReceived += (s, e) => RaiseOutputReceived(e, false); process.ErrorDataReceived += (s, e) => RaiseOutputReceived(e, true); process.BeginOutputReadLine(); process.BeginErrorReadLine(); process.WaitForExit(); process.CancelErrorRead(); process.CancelOutputRead(); retCode = process.ExitCode; process = null; } return(new Result() { Output = outputBuilder.Result, ExitCode = retCode }); } }
/// <summary> /// 执行 /// </summary> /// <returns></returns> public virtual IProcessBasedCommandResult Execute() { lock (executeLock) { outputBuilder.Clear(); int retCode = -1; BeforeProcessStart(processStartInfo); using (process = Process.Start(processStartInfo)) { OnProcessStarted(process); RegisterProcessEvent(process); process.BeginOutputReadLine(); process.BeginErrorReadLine(); BeforeWaiting(process); process.WaitForExit(); process.CancelErrorRead(); process.CancelOutputRead(); retCode = process.ExitCode; OnProcessExited(process); process = null; } return(new Result() { Output = outputBuilder.Result, ExitCode = retCode }); } }
/// <summary> /// 执行 /// </summary> /// <returns></returns> public virtual IProcessBasedCommandResult Execute() { lock (executeLock) { processStartInfo = new ProcessStartInfo() { RedirectStandardError = NeverCreateNewWindow || !Settings.CreateNewWindow, RedirectStandardOutput = NeverCreateNewWindow || !Settings.CreateNewWindow, RedirectStandardInput = false, UseShellExecute = false, CreateNoWindow = NeverCreateNewWindow || !Settings.CreateNewWindow, FileName = executableFile, Arguments = args, }; if (ManagedAdb.Adb.Manager?.Server?.IsEnable == true) { string pathEnv = processStartInfo.EnvironmentVariables["path"]; processStartInfo.EnvironmentVariables["path"] = $"{ManagedAdb.Adb.AdbToolsDir.FullName};{pathEnv}"; processStartInfo.EnvironmentVariables["ANDROID_ADB_SERVER_PORT"] = ManagedAdb.Adb.Server.Port.ToString(); } outputBuilder.Clear(); int retCode = -1; BeforeProcessStart(processStartInfo); using (process = Process.Start(processStartInfo)) { OnProcessStarted(process); RegisterProcessEvent(process); if (process.StartInfo.CreateNoWindow) { process.BeginOutputReadLine(); process.BeginErrorReadLine(); } BeforeWaiting(process); process.WaitForExit(); if (process.StartInfo.CreateNoWindow) { process.CancelErrorRead(); process.CancelOutputRead(); } retCode = process.ExitCode; OnProcessExited(process); process = null; } return(new Result() { Output = outputBuilder.Result, ExitCode = retCode }); } }
/// <summary> /// 无锁的执行..不建议覆写 /// </summary> /// <param name="fileName"></param> /// <param name="args"></param> /// <returns></returns> protected virtual Result ExecuteWithoutLock(string fileName, string args) { if (disposedValue) { throw new ObjectDisposedException(nameof(CommandExecutor)); } int exitCode; ProcessStartInfo pStartInfo; outputBuilder.Clear(); pStartInfo = GetStartInfo(fileName, args); DateTime start = DateTime.Now; currentProcess = Process.Start(pStartInfo); OnProcessStarted(currentProcess); try { CommandExecuting?.Invoke(this, new CommandExecutingEventArgs(fileName, args)); ExecutingSource?.Invoke(this, new CommandExecutingEventArgs(fileName, args)); } catch { } currentProcess.WaitForExit(); DateTime end = DateTime.Now; exitCode = currentProcess.ExitCode; OnProcessExited(currentProcess); currentProcess = null; var result = new Result(outputBuilder.Result, exitCode); try { CommandExecuted?.Invoke(this, new CommandExecutedEventArgs(fileName, args, result, end - start)); ExecutedSource?.Invoke(this, new CommandExecutedEventArgs(fileName, args, result, end - start)); } catch { } return result; }
public void TestClear() { var output = new OutputBuilder().Append(shortMessage); Assert.AreNotEqual(output.Parse(terminalOptions), ""); output.Clear(); Assert.AreEqual(output.Parse(terminalOptions), ""); }
/// <summary> /// 执行 /// </summary> /// <returns></returns> public virtual IProcessBasedCommandResult Execute() { lock (executeLock) { processStartInfo = new ProcessStartInfo() { RedirectStandardError = NeverCreateNewWindow || !Settings.CreateNewWindow, RedirectStandardOutput = NeverCreateNewWindow || !Settings.CreateNewWindow, RedirectStandardInput = false, UseShellExecute = false, CreateNoWindow = NeverCreateNewWindow || !Settings.CreateNewWindow, FileName = executableFile, Arguments = args, }; outputBuilder.Clear(); int retCode = -1; BeforeProcessStart(processStartInfo); using (process = Process.Start(processStartInfo)) { OnProcessStarted(process); RegisterProcessEvent(process); if (process.StartInfo.CreateNoWindow) { process.BeginOutputReadLine(); process.BeginErrorReadLine(); } BeforeWaiting(process); process.WaitForExit(); if (process.StartInfo.CreateNoWindow) { process.CancelErrorRead(); process.CancelOutputRead(); } retCode = process.ExitCode; OnProcessExited(process); process = null; } return(new Result() { Output = outputBuilder.Result, ExitCode = retCode }); } }
public void TestClear() { var output = new OutputBuilder().Append(originalMessage); var outputBuilderType = output.GetType(); var bufferPos = outputBuilderType.GetField("bufferPos", BindingFlags.Instance | BindingFlags.NonPublic); Assert.AreEqual(originalMessage.Length, bufferPos.GetValue(output)); output.Clear(); Assert.AreEqual(0, bufferPos.GetValue(output)); }
/// <summary> /// 执行命令 /// </summary> /// <param name="fileName"></param> /// <param name="args"></param> /// <returns></returns> public ICommandResult Execute(string fileName, string args) { lock (_executingLock) { if (isDisposed) { throw new ObjectDisposedException(nameof(HestExecutor)); } //输出构造器 outputBuilder.Clear(); //记录开始时间 DateTime start = DateTime.Now; //开始进程 currentProcess = Process.Start(GetStartInfo(fileName, args)); //监听 currentProcess.OutputDataReceived += (s, e) => { outputBuilder.AppendOut(e.Data); OutputReceived?.Invoke(this, new OutputReceivedEventArgs(e, false)); }; currentProcess.ErrorDataReceived += (s, e) => { outputBuilder.AppendError(e.Data); OutputReceived?.Invoke(this, new OutputReceivedEventArgs(e, true)); }; currentProcess.BeginOutputReadLine(); currentProcess.BeginErrorReadLine(); //触发事件 CommandExecuting?.Invoke(this, new CommandExecutingEventArgs(fileName, args)); //等待进程结束 currentProcess.WaitForExit(); currentProcess.CancelErrorRead(); currentProcess.CancelOutputRead(); //记录结束时间 DateTime end = DateTime.Now; //构造结果对象 var result = new HestExecutorResult() { ExitCode = currentProcess.ExitCode, Output = outputBuilder.Result }; //触发结束事件 CommandExecuted?.Invoke(this, new CommandExecutedEventArgs(fileName, args, result, end - start)); //返回结果 return(result); }; }
/// <summary>Executes the command.</summary> /// <param name="actionInput">The full input specified for executing the command.</param> public override void Execute(ActionInput actionInput) { var userControlledBehavior = player.Behaviors.FindFirst <UserControlledBehavior>(); userControlledBehavior.SecurityRoles |= role; var ob = new OutputBuilder(); ob.AppendLine($"{player.Name} has been granted the {role.ToString()} role."); ob.AppendLine($"{player.Name} is now: {userControlledBehavior.SecurityRoles}."); actionInput.Controller.Write(ob); ob.Clear(); ob.AppendLine($"You have been granted the {role.ToString()} role."); userControlledBehavior.Controller.Write(ob); player.FindBehavior <PlayerBehavior>()?.SavePlayer(); }
/// <summary> /// 无锁的执行..不建议覆写 /// </summary> /// <param name="fileName"></param> /// <param name="args"></param> /// <returns></returns> protected virtual Result ExecuteWithoutLock(string fileName, string args) { if (disposedValue) { throw new ObjectDisposedException(nameof(CommandExecutor)); } int exitCode; ProcessStartInfo pStartInfo; outputBuilder.Clear(); pStartInfo = GetStartInfo(fileName, args); currentProcess = Process.Start(pStartInfo); OnProcessStarted(currentProcess); currentProcess.WaitForExit(); exitCode = currentProcess.ExitCode; OnProcessExited(currentProcess); currentProcess = null; return(new Result(outputBuilder.Result, exitCode)); }
/// <summary>Executes the command.</summary> /// <param name="actionInput">The full input specified for executing the command.</param> public override void Execute(ActionInput actionInput) { var session = actionInput.Session; if (session == null) { return; // This action only makes sense for player sessions. } var userControlledBehavior = player.FindBehavior <UserControlledBehavior>(); userControlledBehavior.SecurityRoles |= role; var ob = new OutputBuilder(); ob.AppendLine($"{player.Name} has been granted the {role.ToString()} role."); ob.AppendLine($"{player.Name} is now: {userControlledBehavior.SecurityRoles}."); session.Write(ob); ob.Clear(); ob.AppendLine($"You have been granted the {role.ToString()} role."); userControlledBehavior.Session.Write(ob); player.FindBehavior <PlayerBehavior>()?.SavePlayer(); }