NDesk.Options / Mono.Options: параметр с несколькими парами ключ / значение - PullRequest
8 голосов
/ 07 января 2011

Мне нужно проанализировать следующий синтаксис командной строки:

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

key1, key2 и key3 принадлежат параметру p1.

Я нашел Пример # 3 в документации, где показан способ анализа для одной пары ключ / значение.

Анализирует несколько ключей / значенийпары для одного параметра возможны с NDesk.Options

Ответы [ 2 ]

11 голосов
/ 04 февраля 2011

В игре есть более фундаментальный вопрос: есть ли ограничение на число наборов ключ = значение в командной строке?

Если число наборов ключ = значение является переменным, то вы хотите использовать аргумент запускается в соответствии с разрешением <> обработчиком по умолчанию :

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

Это разделит все параметры ключ = значение после /p1 и добавит их вp1 словарь:

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

По понятным причинам я бы посчитал, что вышеизложенное является разумным путем.

Однако, если всегда будет 3 комплекта (и, таким образом,6 обязательных значений), вместо этого вы можете создать подкласс Option, который требует 6 значений:

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

Затем вы можете предоставить эту ActionOption для OptionSet.Add(Option):

var p = new OptionSet {
    new ActionOption<string, string, string, string, string, string> (
            "p1", null, (a, b, c, d, e, f) => {...}),
};
5 голосов
/ 18 апреля 2015

NDesk.Options имеет специальный синтаксис для поддержки именно этого:

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

Теперь вы можете запустить вашу программу из командной строки следующим образом:

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

Обратите внимание, что вы можете установить пары разделителей в опциях конфигурации. В этом примере это [: /]

...