gpt4 book ai didi

c# - 如何使用 NDesk.Options 强制执行所需的命令行选项?

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

我刚刚编写了一个控制台实用程序,并决定使用 NDesk.Options 进行命令行解析。我的问题是,如何强制执行必需的命令行选项?

我在 docs 中看到那:

options with a required value (append '=' to the option name) or an optional value (append ':' to the option name).

但是,当我将 = 放在选项名称的末尾时,行为没有区别。理想情况下,Parse 方法会抛出异常。

还有什么我需要做的吗?

这是我的测试代码:

class Program
{
static void Main(string[] args)
{
bool show_help = false;
string someoption = null;

var p = new OptionSet() {
{ "someoption=", "Some String Option", v => someoption = v},
{ "h|help", "show this message and exit", v => show_help = v != null }
};

List<string> extra;
try
{
extra = p.Parse(args);
}
catch (OptionException e)
{
System.Console.Write("myconsole: ");
System.Console.WriteLine(e.Message);
System.Console.WriteLine("Try `myconsole --help' for more information.");
return;
}

if (show_help)
{
ShowHelp(p);
return;
}

System.Console.WriteLine("==================");
System.Console.WriteLine(someoption);
}

static void ShowHelp(OptionSet p)
{
System.Console.WriteLine("Usage: myconsole [OPTIONS]");
System.Console.WriteLine();
System.Console.WriteLine("Options:");
p.WriteOptionDescriptions(System.Console.Out);
}
}

最佳答案

问题是文档并不像它显然需要的那样清晰。 :-(

具体来说,按照:

http://www.ndesk.org/doc/ndesk-options/NDesk.Options/OptionValueType.html#F:NDesk.Options.OptionValueType.Required

选项规范中的 = 不适用于整个 OptionSet,而仅适用于该特定选项的

这个的重要性实际上只在两种情况下相关,所以首先让我们考虑 OptionSet 解析器:

string a = null;
string b = null;
var options = new OptionSet {
{ "a=", v => a = v },
{ "b=", v => b = v },
};

场景 1 重要的是 OptionSet.Parse() 以单次传递、仅向前的方式工作,并且查看选项值以确定它们是否“应该”值.因此,考虑:

options.Parse(new[]{"-a", "-b"});

这将是 a 的值为 "-b",而 bnull。由于 -a 的处理程序需要一个值,它总是得到以下值(除非该值被“编码”到原始选项中,例如 -a=value)。

第二个重要的地方是当一个需要值的选项是最后一个选项,并且没有它的值时:

options.Parse(new[]{"-a"});

这将抛出 OptionException,因为 -a 的处理程序 需要 一个值,但没有值存在。

因此,如果您有一个选项本身是必需的(而不是一个需要值的选项),您需要手动检查:

string dir = null;
new OptionSet {
{ "o=", v => dir = v },
}.Parse (args);

if (dir == null)
throw new InvalidOperationException ("Missing required option -o=DIR");

关于c# - 如何使用 NDesk.Options 强制执行所需的命令行选项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3427306/

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