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",而且b是null.由于处理程序-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)
| 归档时间: |
|
| 查看次数: |
7771 次 |
| 最近记录: |