Command Line Parser具有互斥的必需参数

Jul*_*obs 23 c# command-line command-line-arguments

我开始使用CommandLine Parser Library来获得一个既有GUI又有命令行执行的工具.通过命令行选项启动GUI.

因此,如果程序在命令行模式下执行,我希望有必要的选项.基本上,如果没有设置选项"Gui",我会要求选项1和选项2.

我试图将MutuallyExclusiveSet和Required属性结合起来,如下所示,但它没有像我想象的那样工作.我是否误解了"MutuallyExclusiveSet"的概念,或者只是误用了它?或者图书馆还没有支持?

public class CommandLineOptions : CommandLineOptionsBase
{
    [Option(null, "gui", Required = false, HelpText = "Launch the GUI", MutuallyExclusiveSet = "Gui")]
    public bool Gui { get; set; }

    [Option(null, "opt1", HelpText = "Option 1", MutuallyExclusiveSet = "CommandLine", Required = true)]
    public string Option1 { get; set; }

    [Option(null, "opt2", HelpText = "Option 2", MutuallyExclusiveSet = "CommandLine", Required = true)]
    public string Option2 { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

gss*_*der 43

属于互斥集的所有选项在它们之间是互斥的.请遵循以下示例:

class Options {
  [Option("a", null, MutuallyExclusiveSet="zero")] 
  public string OptionA { get; set; }
  [Option("b", null, MutuallyExclusiveSet="zero")] 
  public string OptionB { get; set; }
  [Option("c", null, MutuallyExclusiveSet="one")] 
  public string OptionC { get; set; }
  [Option("d", null, MutuallyExclusiveSet="one")] 
  public string OptionD { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

使用这些规则后面的命令行是有效的:

$ app -a foo -c bar
$ app -a foo -d bar
$ app -b foo -c bar
$ app -b foo -d bar
Run Code Online (Sandbox Code Playgroud)

而这些不是:

$ app -a foo -b bar
$ app -c foo -d bar
$ app -a foo -b bar -c foo1 -d foo2
Run Code Online (Sandbox Code Playgroud)

如您所见,您无法一起指定属于同一组的选项.还要记住,预构建的单例(CommandLineParser.Default)不能与MutualliyExclusiveSet属性一起使用.你需要自己打扮一个解析器:

if (new CommandLineParser(new CommandLineParserSettings {
                            MutuallyExclusive = true,
                            CaseSensitive = true,
                            HelpWriter = Console.Error}).ParseArguments(args, opts) {
  // consume values here
  Console.WriteLine(opts.OptionA);
}
Run Code Online (Sandbox Code Playgroud)

这是互斥选项在命令行分析程序库中的工作方式.无论如何要解决您的具体问题,我建议您像在普通控制台应用程序中那样定义所有选项.然后添加Gui布尔开关.如果指定此选项,则忽略其他选项.如果不是一般的控制台应用程序.

(另一件事:在后续版本中将是一个名为"子命令"的功能,可让您管理多种选项类型;这可能是即将推出的功能的正确选择.)

编辑2015-08-30:

1.9.x stable中实现的功能始终会产生混淆,默认情况下已禁用,并要求开发人员通过设置实例激活它.

版本2.0.x,其中内核被完全重写,该功能始终处于活动状态,我将尝试显示一个简单的示例(请记住公共API已更改,因为2.0.x是主要版本更新).


class Options {
  [Option(SetName = "web")]
  public string WebUrl { get; set; }
  [Option(SetName = "web")]
  public int MaxLinks { get; set; }

  [Option(SetName = "ftp")]
  public string FtpUrl { get; set; }
  [Option(SetName = "ftp")]
  public int MaxFiles { get; set; }

  [Option]
  public bool Verbose { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

set中的ftpset与from不相容web,--verbose(不属于set,或者更好属于默认值"",中性,可以随意混合).有效:


$ app --weburl http://stackoverflow.com --maxlinks 99
$ app --ftpurl ftp://ftp.myoffice.files.com --maxfiles 1234
$ app --verbose --weburl http://twitter.com --maxlinks 777
$ app --ftpurl ftp://ftp.xyz.org --maxfiles 44 --verbose
$ app --verbose
Run Code Online (Sandbox Code Playgroud)

无效:


$ app --weburl http://stackoverflow.com --maxlinks 99 --ftpurl ftp://ftp.xyz.org
$ app --ftpurl ftp://ftp.myoffice.files.com --maxfiles 1234 --maxlinks 777
$ app --verbose --weburl http://twitter.com --maxfiles 44
$ app --maxfiles 44 --maxlinks 99
Run Code Online (Sandbox Code Playgroud)

  • 这与[wiki](https://github.com/gsscoder/commandline/wiki/Mutually-Exclusive-Options)说它的工作方式完全相反,但它似乎是如何工作的. (4认同)
  • @gsscoder你的帖子仍然没有解释(至少对我来说)如何使用`Required`和`SetName`的组合. (3认同)