2011-01-07 6 views
7

necesito para analizar la sintaxis de línea de comandos siguiente:NDesk.Options/Mono.Options: Parámetro con múltiples pares clave/valor

MyApplication.exe /p1 key1=value1 key2=value2 key3=value3 /p2 

key1, Key2 & Key3 pertenecen al parámetro P1.

He encontrado Example #3 en la documentación, que muestra una forma de analizar para un solo par de clave/valor.

está analizando para múltiples pares clave/valor para un único parámetro es posible con NDesk.Options

Respuesta

11

Hay una pregunta más fundamental en juego: ¿hay un límite al número de conjuntos clave = valor en la línea de comandos?

Si el número de clave = conjuntos de valores es variable, entonces usted desea utilizar argumento es según lo permitido por la <> default handler:

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]); 
    } }, 
}; 

Esto dividirá todas las opciones clave = valor después /p1 y añadirlos a la p1 diccionario:

p.Parse (new[]{"/p1", "key1=value1", "key2=value2", "/p2"}); 
// `p1` now contains { { "key1", "value1" }, {"key2", "value2" } } 

Por razones obvias, me gustaría considerar lo anterior que es la forma razonable para ir.

Sin embargo, si siempre habrá 3 juegos (y por tanto 6 valores requeridos), en su lugar podría crear una subclase opción que requiere 6 valores:

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))); 
    } 
} 

A continuación, puede proporcionar esta ActionOption a OptionSet.Add(Option):

var p = new OptionSet { 
    new ActionOption<string, string, string, string, string, string> (
      "p1", null, (a, b, c, d, e, f) => {...}), 
}; 
5

NDesk.Options tiene una sintaxis especial para el apoyo exactamente esto:

 var pars = new Hashtable(); 
     var opts = new NDesk.Options.OptionSet{ 
      {"p={:}{/}", (n,v) => pars.Add(n, v)} 
     }; 

Ahora se puede ejecutar su programa con la línea de comando como este:

-p=key1:value1 -p=key2/value2 

Aviso, que puede establecer pares delimitador en la configuración de opciones. En este ejemplo, es [: /]

Cuestiones relacionadas