NDesk.Options:如何正确注册所需参数?

Bre*_*eak 22 .net c# command-line command-line-arguments

我试图OptionSet通过以下方式利用该类:

  string resultsFileName = null;
  bool isHelp = false;

  var p = new OptionSet() {
    { "r=|resultsFile=",  "The file with the results", v => { resultsFileName = v; } }
    { "h|help", "Show this help", v => { isHelp = (v != null); } },
  };

  try
  {
    p.Parse(args);
  }
  catch (OptionException e)
  {
    Console.WriteLine("Invalid arguments: " + e.Message);
    ShowHelp(p);
    return;
  }
Run Code Online (Sandbox Code Playgroud)

因此,resultsFile预计需要选项(根据文件:http://www.ndesk.org/doc/ndesk-options/NDesk.Options/OptionValueType.html).但是,当我按原样运行程序时(即没有命令行参数),不会抛出异常.请协助.

更新:它在调试器中查找,如果没有提供命令行选项,private void AssertValid (int index)将永远不会到达该方法throw new OptionException.

jon*_*onp 24

这是如何使用NDesk.Options强制执行所需的命令行选项的副本?,答案是一样的: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)

  • 谢谢你的快速回答!(但是,这个功能不受支持有点可怜,因为它会有助于提高命令行参数验证的稳健性). (3认同)