【问题标题】:Reporting unknown arguments using CommandLineParser使用 CommandLineParser 报告未知参数
【发布时间】:2013-02-17 20:23:58
【问题描述】:

有没有办法让Command Line Parser library 报告未知参数?

给定以下选项类:

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”调用程序时 我只是得到默认的使用信息,但没有提到是什么错误导致解析失败。我想向用户说明出了什么问题。

【问题讨论】:

标签: c# command-line command-line-arguments command-line-parser


【解决方案1】:

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

长篇大论:

如果您在 GetUsage 方法中添加一个刹车点,您将看到 LastParserState 不为空,而是包含 0 个元素。

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

来源Github

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

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

因此,解析器内部不会存储任何有关出错的信息,只需记录该事实即可。

【讨论】:

  • 我认为这将是一个有用的功能,所以我建议您应该创建一个功能请求,因为在这个问题上。
  • 谢谢!好分析。我检查了 LastParserState 并得出结论,它不存在。不过没有花时间通过源代码进行调试。
  • 查看原始issue;它可能会修复当前的开发分支。
  • 链接已损坏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-06-10
  • 1970-01-01
  • 2018-04-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多