5

有没有办法让命令行解析器库报告未知参数?

给定以下选项类:

public class Options
{
    [Option('i', "int-option", DefaultValue = 10, HelpText = "Set the int")]
    public int IntOption { get; set; }

    [ParserState]
    public IParserState LastParserState { get; set; }

    [HelpOption]
    public string GetUsage()
    {
        return HelpText.AutoBuild(this, 
            HelpText.DefaultParsingErrorsHandler(this, current));
    }
}

以及以下程序:

var options = new Options();
var parser = new Parser(settings =>
{
    settings.HelpWriter = Console.Error;
    settings.IgnoreUnknownArguments = false;
});

if (parser.ParseArgumentsStrict(args, options))
{
    Console.WriteLine("Int value set: {0}", options.IntOption);
}

当使用“MyProgram.exe --unknown”调用程序时,我只得到了默认的使用信息,但没有提到导致解析失败的错误。我想向用户说明出了什么问题。

4

1 回答 1

3

长话短说:使用当前的实现,您无法获得有关未知选项的任何信息。

长篇大论:

如果你在你的GetUsage方法中加入一个刹车点,你会看到它LastParserState不是 null 而是包含 0 个元素。

LastParserState基本上是从ArgumentParser.PostParsingState填充的,但是LongOptionParser(在您的情况下由于--双破折号而涉及)没有PostParsingState在其 parse 方法内向集合中添加任何内容:

来自Github的来源:

var parts = argumentEnumerator.Current.Substring(2).Split(new[] { '=' }, 2);
var option = map[parts[0]];

if (option == null)
{
    return _ignoreUnkwnownArguments ? PresentParserState.MoveOnNextElement : 
                                      PresentParserState.Failure;
}

所以在内部,解析器不会存储任何关于出了什么问题的信息,只是记录这个事实。

于 2013-03-03T20:18:46.887 回答