public int Execute(params string[] args) { CommandLineApplication command = this; IEnumerator <CommandArgument> arguments = null; if (HandleResponseFiles) { args = ExpandResponseFiles(args).ToArray(); } for (var index = 0; index < args.Length; index++) { var arg = args[index]; bool isLongOption = arg.StartsWith("--"); if (isLongOption || arg.StartsWith("-")) { CommandOption option; var result = ParseOption(isLongOption, command, args, ref index, out option); if (result == ParseOptionResult.ShowHelp) { command.ShowHelp(); return(0); } else if (result == ParseOptionResult.ShowVersion) { command.ShowVersion(); return(0); } } else { var subcommand = ParseSubCommand(arg, command); if (subcommand != null) { command = subcommand; } else { if (arguments == null) { arguments = new CommandArgumentEnumerator(command.Arguments.GetEnumerator()); } if (arguments.MoveNext()) { arguments.Current.Values.Add(arg); } else { HandleUnexpectedArg(command, args, index, argTypeName: "command or argument"); } } } } return(command.Invoke()); }
public int Execute(params string[] args) { CommandLineApplication command = this; CommandArgumentEnumerator arguments = null; if (HandleResponseFiles) { args = ExpandResponseFiles(args).ToArray(); } for (var index = 0; index < args.Length; index++) { var arg = args[index]; bool isLongOption = arg.StartsWith("--"); if (arg == "-?" || arg == "/?") { command.ShowHelp(); return(0); } else if (isLongOption || arg.StartsWith("-")) { CommandOption option; var result = ParseOption(isLongOption, command, args, ref index, out option); if (result == ParseOptionResult.ShowHelp) { command.ShowHelp(); return(0); } else if (result == ParseOptionResult.ShowVersion) { command.ShowVersion(); return(0); } else if (result == ParseOptionResult.UnexpectedArgs) { break; } } else { var subcommand = ParseSubCommand(arg, command); if (subcommand != null) { command = subcommand; } else { if (arguments == null || arguments.CommandName != command.Name) { arguments = new CommandArgumentEnumerator(command.Arguments.GetEnumerator(), command.Name); } if (arguments.MoveNext()) { arguments.Current.Values.Add(arg); } else { HandleUnexpectedArg(command, args, index, argTypeName: "command or argument"); break; } } } } if (Commands.Count > 0 && command == this) { throw new CommandParsingException( command, "Required command missing", isRequireSubCommandMissing: true); } return(command.Invoke()); }
public int Execute(params string[] args) { CommandLineApplication command = this; CommandOption option = null; IEnumerator <CommandArgument> arguments = null; if (HandleResponseFiles) { args = ExpandResponseFiles(args).ToArray(); } for (var index = 0; index < args.Length; index++) { var arg = args[index]; var processed = false; if (!processed && option == null) { string[] longOption = null; string[] shortOption = null; if (arg.StartsWith("--")) { longOption = arg.Substring(2).Split(new[] { ':', '=' }, 2); } else if (arg.StartsWith("-")) { shortOption = arg.Substring(1).Split(new[] { ':', '=' }, 2); } if (longOption != null) { processed = true; string longOptionName = longOption[0]; option = command.Options.SingleOrDefault(opt => string.Equals(opt.LongName, longOptionName, StringComparison.Ordinal)); if (option == null) { if (string.IsNullOrEmpty(longOptionName) && !command._throwOnUnexpectedArg && AllowArgumentSeparator) { // a stand-alone "--" is the argument separator, so skip it and // handle the rest of the args as unexpected args index++; } HandleUnexpectedArg(command, args, index, argTypeName: "option"); break; } // If we find a help/version option, show information and stop parsing if (command.OptionHelp == option) { command.ShowHelp(); return(0); } else if (command.OptionVersion == option) { command.ShowVersion(); return(0); } if (longOption.Length == 2) { if (!option.TryParse(longOption[1])) { command.ShowHint(); throw new CommandParsingException(command, $"Unexpected value '{longOption[1]}' for option '{option.LongName}'"); } option = null; } else if (option.OptionType == CommandOptionType.NoValue || option.OptionType == CommandOptionType.BoolValue) { // No value is needed for this option option.TryParse(null); option = null; } } if (shortOption != null) { processed = true; option = command.Options.SingleOrDefault(opt => string.Equals(opt.ShortName, shortOption[0], StringComparison.Ordinal)); // If not a short option, try symbol option if (option == null) { option = command.Options.SingleOrDefault(opt => string.Equals(opt.SymbolName, shortOption[0], StringComparison.Ordinal)); } if (option == null) { HandleUnexpectedArg(command, args, index, argTypeName: "option"); break; } // If we find a help/version option, show information and stop parsing if (command.OptionHelp == option) { command.ShowHelp(); return(0); } else if (command.OptionVersion == option) { command.ShowVersion(); return(0); } if (shortOption.Length == 2) { if (!option.TryParse(shortOption[1])) { command.ShowHint(); throw new CommandParsingException(command, $"Unexpected value '{shortOption[1]}' for option '{option.LongName}'"); } option = null; } else if (option.OptionType == CommandOptionType.NoValue || option.OptionType == CommandOptionType.BoolValue) { // No value is needed for this option option.TryParse(null); option = null; } } } if (!processed && option != null) { processed = true; if (!option.TryParse(arg)) { command.ShowHint(); throw new CommandParsingException(command, $"Unexpected value '{arg}' for option '{option.LongName}'"); } option = null; } if (!processed && arguments == null) { var currentCommand = command; foreach (var subcommand in command.Commands) { if (string.Equals(subcommand.Name, arg, StringComparison.OrdinalIgnoreCase)) { processed = true; command = subcommand; break; } } // If we detect a subcommand if (command != currentCommand) { processed = true; } } if (!processed) { if (arguments == null) { arguments = new CommandArgumentEnumerator(command.Arguments.GetEnumerator()); } if (arguments.MoveNext()) { processed = true; arguments.Current.Values.Add(arg); } } if (!processed) { HandleUnexpectedArg(command, args, index, argTypeName: "command or argument"); break; } } if (option != null) { command.ShowHint(); throw new CommandParsingException(command, $"Missing value for option '{option.LongName}'"); } return(command.Invoke()); }