public async Task <int> ExecuteAsync(ShellCommand command) { Command?cmd = Cli.Wrap(_shell) .WithArguments("/c " + command.Command + " " + command.Arguments) .WithWorkingDirectory(command.WorkDirectory ?? _boostApplicationContext.WorkingDirectory.FullName); var exitCode = 0; await foreach (CommandEvent? cmdEvent in cmd.ListenAsync()) { switch (cmdEvent) { case StartedCommandEvent started: _messageHandler?.Invoke(new ShellMessage( _session.Next(), "cmd", $"{_shell}> {command.Command} {command.Arguments}") { Tags = new[] { "command" } }); break; case StandardOutputCommandEvent stdOut: _messageHandler?.Invoke(new ShellMessage(_session.Next(), "info", stdOut.Text) { Tags = ShellMessageTagger.GetTags(stdOut.Text) }); break; case StandardErrorCommandEvent stdErr: _messageHandler?.Invoke(new ShellMessage(_session.Next(), "error", stdErr.Text) { Tags = new[] { "error" } }); break; case ExitedCommandEvent exited: exitCode = exited.ExitCode; _messageHandler?.Invoke(new ShellMessage( _session.Next(), "end", (exitCode == 0) ? "Command completed successfully" : $"Command completed with errors (ExitCode: {exitCode})" ) { Tags = new string[] { (exitCode == 0) ? "success" : "error" } }); break; } } return(exitCode); }
public async Task <int> ExecuteAsync(ShellCommand command) { _startInfo.Arguments = $"/c {command.Command} {command.Arguments}"; _messageHandler?.Invoke(new ShellMessage( _session.Next(), "cmd", $"{_startInfo.FileName}> {command.Command} {command.Arguments}") { Tags = new[] { "command" } }); var process = new Process(); process.StartInfo = _startInfo; process.StartInfo.WorkingDirectory = command.WorkDirectory ?? _boostApplicationContext.WorkingDirectory.FullName; process.EnableRaisingEvents = true; process.OutputDataReceived += Process_OutputDataReceived; process.ErrorDataReceived += Process_ErrorOutputDataReceived; process.Start(); process.BeginOutputReadLine(); process.BeginErrorReadLine(); _messageHandler?.Invoke(new ShellMessage(_session, "start", "")); await process.WaitForExitAsync();; _messageHandler?.Invoke(new ShellMessage( _session.Next(), "end", (process.ExitCode == 0) ? "Command completed successfully" : $"Command completed with errors (ExitCode: {process.ExitCode})" ) { Tags = new string[] { (process.ExitCode == 0) ? "success" : "error" } }); return(process.ExitCode); }
public async Task <int> IndexWorkRootsAsync( [Service] IHubContext <ConsoleHub> hubContext, [Service] ILocalRepositoryIndexer repositoryIndexer, [Service] IUserSettingsManager settingsManager, CancellationToken cancellationToken) { UserSettings settings = await settingsManager.GetAsync(cancellationToken); var session = new MessageSession(); Action <string> handler = async(string msg) => { await hubContext.Clients.All.SendAsync("consoleData", new ShellMessage(session.Next(), "Info", msg)); }; int indexCount = 0; foreach (WorkRoot wr in settings.WorkRoots) { var count = await repositoryIndexer.IndexWorkRootAsync( wr, handler, cancellationToken); indexCount += count; } await hubContext.Clients.All.SendAsync("consoleData", new ShellMessage(session.Next(), "end", $"Scan completed: {indexCount}") { Tags = new string[] { "success" } }); return(indexCount); }