/// <inheritdoc /> public void Run(params string[] args) { _console.WriteLine($"{AppName} {AppVersion}"); if (args.Length < 1) { OutputModuleList(); return; } var module = _modules.FirstOrDefault(m => InvariantStringMatch(args[0], m.Name)); if (module == null) { OutputModuleList(); return; } if (args.Length < 2) { OutputCommandList(module); return; } var command = module.Commands.FirstOrDefault(c => InvariantStringMatch(args[1], c.Name)); if (command == null) { OutputCommandList(module); return; } var cmd = _argParser.Parse(args.Skip(2)); _loggerConfigurationSource.VerbosityLevel = cmd.LogLevel; _console.WriteLine($"Using {cmd.LogLevel} log level."); if (!cmd.Options.Any() && !cmd.InputFiles.Any()) { OutputParameterList(module, command); return; } _console.WriteLine($"Executing {module.Name} {command.Name}."); var task = command.TaskFactory(cmd); _appProgressTracker.Add(task); try { task.Run(); } catch (Exception e) { _appProgressTracker.Fail(task, e); throw; } finally { _appProgressTracker.Remove(task); } _console.WriteLine($"Task complete."); }