Big*_*714 34 c# console-application command-line-parsing ndesk.options
我只是编写一个控制台实用程序,并决定使用NDesk.Options进行命令行解析.我的问题是,如何强制执行所需的命令行选项?
我在文档中看到:
具有所需值的选项(将"="附加到选项名称)或可选值(将":"附加到选项名称).
但是,当我=在选项名称末尾添加a 时,行为没有区别.理想情况下,Parse方法会抛出异常.
我还需要做些什么吗?
这是我的测试代码:
class Program
{
static void Main(string[] args)
{
bool show_help = false;
string someoption = null;
var p = new OptionSet() {
{ "someoption=", "Some String Option", v => someoption = v},
{ "h|help", "show this message and exit", v => show_help = v != null }
};
List<string> extra;
try
{
extra = p.Parse(args);
}
catch (OptionException e)
{
System.Console.Write("myconsole: ");
System.Console.WriteLine(e.Message);
System.Console.WriteLine("Try `myconsole --help' for more information.");
return;
}
if (show_help)
{
ShowHelp(p);
return;
}
System.Console.WriteLine("==================");
System.Console.WriteLine(someoption);
}
static void ShowHelp(OptionSet p)
{
System.Console.WriteLine("Usage: myconsole [OPTIONS]");
System.Console.WriteLine();
System.Console.WriteLine("Options:");
p.WriteOptionDescriptions(System.Console.Out);
}
}
Run Code Online (Sandbox Code Playgroud)
jon*_*onp 42
问题是文档不像显然需要的那样清晰.:-(
具体来说,按照:
该=选项规范内并不适用于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)
| 归档时间: |
|
| 查看次数: |
13068 次 |
| 最近记录: |