4

是否有任何方法可以使Command Line Parser library报告未知参数?使用CommandLineParser报告未知参数

鉴于以下选项类别:

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” 节目我只是得到默认的使用信息,但没有提及解析失败导致的错误。我想向用户提供一些指示,指出哪里出了问题。

+1

作为参考,在''develop''分支中问题是**固定**。这里的说明︰https://github.com/gsscoder/commandline/wiki/Latest-Beta – jay 2013-03-04 15:28:57

回答

3

长话短说:与目前的实施,你不能得到任何有关未知选项的信息。

长的故事:

如果你把brakepoint到您GetUsage方法,你会看到LastParserState不为空,但包含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; 
} 

因此,内部解析器并不存储关于出错的信息,只记录该事实。

+1

我认为这将是一个有用的功能,所以我建议你应该创建一个功能请求,因为在这个问题上。 – nemesv 2013-03-03 20:19:05

+0

谢谢!良好的分析。我检查了LastParserState并得出结论,它不在那里。虽然没有花时间通过源代码进行调试。 – PHeiberg 2013-03-03 20:29:46

+0

查看来源[issue](https://github.com/gsscoder/commandline/issues/64);它可能会被固定在当前的开发分支上。 – jay 2013-03-04 06:36:15