2013-02-06 49 views
0

如何獲得NDesk在命令行(C#)解析多個參數列表?如何獲得NDesk在命令行解析多個arg列表?

我有兩個標誌,都採取多個參數(文件列表)。所以一個是-j,另一個是-c。但我認爲NDesk要求每個參數與-j/-c前面)

比如我想:

%> main -j file1.j file2.j file3.j -c file4.c file5.c file6.c file7.c 

而且有它產生2所列出,一個與.J文件另一個是.c文件。但是,它希望以這種方式列出的每個文件都以該標誌開頭。

那麼這將工作:

%> main -j file1.j -j file2.j -j file3.j -c file4.c -c file5.c -c file6.c -c file7.c 

雖然我寧願有第一個版本。

有沒有辦法做到這一點與NDesk.Options庫?我已經閱讀了大部分文檔,我不認爲它是。

+0

我編輯了你的標題。請參見「[應的問題包括‘標籤’,在他們的頭銜?(http://meta.stackexchange.com/questions/19190/)」,這裏的共識是「不,他們不應該」。 –

回答

2

有一種方法可以做到這一點,但它需要很少的破解。 NDesk使用「<>」作爲特殊的默認處理程序。你所做的是跟蹤「當前」參數,然後讓默認處理程序決定如何處理基於當前參數的值。這裏是一個示例,我將這些值放入字典中。

static void Main(string[] args) 
{ 
    string currentParameter = ""; 
    Dictionary<string, List<string>> parameters = new Dictionary<string, List<string>>(); 
    OptionSet set = new OptionSet() { 
      { "c", ".c files", v => currentParameter = "c" }, 
      { "j", ".j files", v => currentParameter = "j" }, 
      { "<>", v => { 

        List<string> values; 
        if (parameters.TryGetValue(currentParameter, out values)) 
        { 
         values.Add(v); 
        } 
        else 
        { 
         values = new List<string> { v }; 
         parameters.Add(currentParameter, values); 
        } 

       } 
      } 
     }; 

    set.Parse(args); 
    foreach (var parameter in parameters) 
    { 
     Console.WriteLine("Parameter: {0}", parameter.Key); 
     foreach (var value in parameter.Value) 
     { 
      Console.WriteLine("\t{0}", value); 
     } 
    } 
} 

的輸出是:

參數:J-
file1.j
file2.j
file3.j
參數:C
file4.c
file5.c
file6.c
file7.c

+0

技術上[規格](http://www.ndesk.org/doc/ndesk-options/NDesk.Options/OptionSet.html)支持'貪婪'選項,但它看起來像你必須重寫'OptionSet'並寫它自己支持這個功能;否則使用此解決方案。 – drzaus

1

另一種方式做,這是覆蓋OptionSet.Parseas outlined here

這個例子描述了一個更徹底的「串聯/追加」的方式,將分析所有的格式,但如果你是在處理-flag value1 value2 value3 ... valueN只是感興趣,那麼你可以使用:

public class MultiOptionSet : OptionSet 
{ 
    private string lastArg; 
    private Option lastOption; 

    protected override bool Parse(string argument, OptionContext c) 
    { 
     // based on example in http://www.ndesk.org/doc/ndesk-options/NDesk.Options/Option.html#M:NDesk.Options.Option.OnParseComplete(NDesk.Options.OptionContext) 

     string f, n, s, v; 
     bool haveParts = GetOptionParts(argument, out f, out n, out s, out v); 

     // reset placeholder for next multiple if we are looking at a flagged argument name 
     if(haveParts) 
     { 
      lastArg = f + n; 
     } 
     // are we after a flagged argument name, without parts (meaning a value) 
     else 
     { 
      // remember for next time, in case it's another value 
      if(null != c.Option) lastOption = c.Option; 
      // but if the 'last arg' wasn't already provided, we reuse the one we set last time 
      else 
      { 
       c.Option = lastOption; 
       c.OptionName = lastArg; 
      } 

      c.OptionValues.Add(argument); // add the value to be invoked 
      c.Option.Invoke(c); // perform the 'setter' 
      return true; 
     } 

     return base.Parse(argument, c); 
    } 
} 
+0

hm ...似乎處理'/ flag:value1 value2 value3'和'-flagvalue1 value2 value3'就好了...... – drzaus