Pas*_*ger 8 .net c# mono command-line console-application
我需要解析以下命令行语法:
MyApplication.exe /p1 key1=value1 key2=value2 key3=value3 /p2
Run Code Online (Sandbox Code Playgroud)
key1,key2和key3属于参数p1.
我在文档中找到了示例#3,它显示了解析单个键/值对的方法.
使用NDesk.Options解析单个参数的多个键/值对
jon*_*onp 11
还有一个更基本的问题:命令行上key = value集的数量是否有限制?
如果key = value集的数量是可变的,那么您希望使用默认处理程序允许的参数运行:<>
Dictionary<string, string> cur = null;
Dictionary<string, string> p1 = new Dictionary<string, string>();
Dictionary<string, string> p2 = new Dictionary<string, string>();
var p = new OptionSet () {
{ "p1", v => { cur = p1; } },
{ "p2", v => { cur = p2; } },
{ "<>", v => {
string[] values = v.Split (new[]{'=', ':'}, 2);
cur.Add (values [0], values [1]);
} },
};
Run Code Online (Sandbox Code Playgroud)
这将在之后拆分所有key = value选项/p1
并将它们添加到p1
字典中:
p.Parse (new[]{"/p1", "key1=value1", "key2=value2", "/p2"});
// `p1` now contains { { "key1", "value1" }, {"key2", "value2" } }
Run Code Online (Sandbox Code Playgroud)
出于显而易见的原因,我认为上述是合理的方式.
但是,如果总有3组(因此需要6个值),则可以创建一个需要6个值的Option子类:
class ActionOption<T1, T2, T3, T4, T5, T6> : Option {
Action<T1, T2, T3, T4, T5, T6> action;
public ActionOption (string prototype, string description,
Action<T1, T2, T3, T4, T5, T6> action)
: base (prototype, description, 6)
{
this.action = action;
}
protected override void OnParseComplete (OptionContext c)
{
action (
Parse<T1>(c.OptionValues [0], c)),
Parse<T2>(c.OptionValues [1], c)),
Parse<T3>(c.OptionValues [2], c)),
Parse<T4>(c.OptionValues [3], c)),
Parse<T5>(c.OptionValues [4], c)),
Parse<T6>(c.OptionValues [5], c)));
}
}
Run Code Online (Sandbox Code Playgroud)
然后,您可以将此ActionOption提供给OptionSet.Add(Option)
:
var p = new OptionSet {
new ActionOption<string, string, string, string, string, string> (
"p1", null, (a, b, c, d, e, f) => {...}),
};
Run Code Online (Sandbox Code Playgroud)
NDesk.Options有特殊的语法来支持这个:
var pars = new Hashtable();
var opts = new NDesk.Options.OptionSet{
{"p={:}{/}", (n,v) => pars.Add(n, v)}
};
Run Code Online (Sandbox Code Playgroud)
现在您可以使用命令行运行您的程序,如下所示:
-p=key1:value1 -p=key2/value2
Run Code Online (Sandbox Code Playgroud)
请注意,您可以在选项配置中设置对分隔符.在这个例子中它是[:/]