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

Big*_*714 34 c# console-application command-line-parsing ndesk.options

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

我在文档中看到:

具有所需值的选项(将"="附加到选项名称)或可选值(将":"附加到选项名称).

但是,当我=在选项名称末尾添加a 时,行为没有区别.理想情况下,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);
    }
}
Run Code Online (Sandbox Code Playgroud)

jon*_*onp 42

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

具体来说,按照:

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 },
};
Run Code Online (Sandbox Code Playgroud)

方案1在那里重要的是,OptionSet.Parse()工作在单通,只进的方式,而不会看选项值,以确定它们是否"应该是"值.因此,考虑:

options.Parse(new[]{"-a", "-b"});
Run Code Online (Sandbox Code Playgroud)

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

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

options.Parse(new[]{"-a"});
Run Code Online (Sandbox Code Playgroud)

这将抛出一个OptionException,因为处理程序-a 需要一个值,并且不存在任何值.

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

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

if (dir == null)
    throw new InvalidOperationException ("Missing required option -o=DIR");
Run Code Online (Sandbox Code Playgroud)