gpt4 book ai didi

c# - 具有互斥必需参数的命令行解析器

转载 作者:IT王子 更新时间:2023-10-29 04:29:54 24 4
gpt4 key购买 nike

我开始使用 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; }
}

最佳答案

属于互斥集合的所有选项在它们之间是互斥的。按照这个例子:

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; }
}

根据这些规则,以下命令行是有效的:

$ app -a foo -c bar
$ app -a foo -d bar
$ app -b foo -c bar
$ app -b foo -d bar

这些不是:

$ app -a foo -b bar
$ app -c foo -d bar
$ app -a foo -b bar -c foo1 -d foo2

如您所见,您不能同时指定属于同一集合的选项。还请记住,预构建的单例 (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);
}

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

(另一件事:在后续版本中将有一个称为“子命令”的功能,它可以让您管理多个选项类型;这可能是这个即将推出的功能的正确案例。)

编辑 2015-08-30:

在 1.9.x 稳定版中实现的功能总是造成困惑,默认情况下被禁用,需要开发人员通过设置实例激活它。

版本 2.0.x,内核被完全重写,该功能始终处于事件状态,我将尝试展示一个简单的示例(请记住,公共(public) 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; }
}

Set from ftp set与来自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

无效:


$ 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

关于c# - 具有互斥必需参数的命令行解析器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10639320/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com