2

我已经定义

var p = new OptionSet () {
 // various options defined
};

然后我

p.Parse(args)

如果我用

myprogram --thisOptionIsNotDefined

我想显示帮助消息,而不是继续。但是 Parse() 在遇到无效选项时不会抛出 OptionException。我该怎么办?

4

2 回答 2

5

您可以查询返回OptionSet.Parse()以查找任何无效参数。

从 NDesk 选项集文档

OptionSet.Parse(IEnumerable),返回一个没有被注册的 NDesk.Options.Option 匹配的所有参数的列表。

于 2013-01-31T18:33:46.513 回答
1

OptionSet.Parse()返回任何未处理的参数。但是请注意,这也可能包括程序的任何实际(非选项)参数,例如输入文件。在这种情况下,您不能只检查是否没有返回任何内容。

例如解析以下args将返回["input.txt", "--thisOptionIsNotDefined"]

myprogram input.txt --thisOptionIsNotDefined

为了解决这个特殊问题,我写了一个扩展方法p.ParseStrict(args)。它只是检查解析后没有未处理的选项(考虑--到)。

public static class MonoOptionsExtensions
{
    public static List<string> ParseStrict(this OptionSet source, IEnumerable<string> arguments)
    {
        var args = arguments.ToArray();
        var beforeDoubleDash = args.TakeWhile(x => x != "--");

        var unprocessed = source.Parse(beforeDoubleDash);

        var firstUnprocessedOpt = unprocessed.Find(x => x.Length > 0 && (x[0] == '-' || x[0] == '/'));
        if (firstUnprocessedOpt != null)
            throw new OptionException("Unregistered option '" + firstUnprocessedOpt + "' encountered.", firstUnprocessedOpt);

        return unprocessed.Concat(args.SkipWhile(x => x != "--").Skip(1)).ToList();
    }
}
于 2018-03-13T19:20:36.047 回答