4

我是 NDesk.Options 库的新手。无法找出解析简单项目列表的最简单方法。

示例: prog --items=item1 item2 item3 (我想在代码中使用 List items)

它应该支持引用以及我想将项目列表用作文件或目录名称的列表。

prog --items="c:\a\b\c.txt" "c:\prog files\d.txt" prog --dirs="c:\prog files\" "d:\x\y\space在目录名中”

4

2 回答 2

6

您可以使用“<>”输入,它表示没有标志与输入关联。由于选项是从左到右读取的,因此您可以在遇到起始标志时设置“currentParameter”标志,并假设任何没有标志的后续输入都是列表的一部分。这是一个示例,我们可以将 List 指定为输入文件,并将 Dictionary (Parameters) 指定为键值对列表。当然也可以使用其他变体。

OptionSet options = new OptionSet()
        {
            {"f|file", "a list of files" , v => {
                currentParameter = "f";
            }},
            {"p", @"Parameter values to use for variable resolution in the xml - use the form 'Name=Value'.  a ':' or ';' may be used in place of the equals sign", v => {
                currentParameter = "p";
            }},
            { "<>", v => {
                switch(currentParameter) {
                    case "p":
                        string[] items = v.Split(new[]{'=', ':', ';'}, 2);
                        Parameters.Add(items[0], items[1]);
                        break;
                    case "f":
                        Files.Add(Path.Combine(Environment.CurrentDirectory, v));
                        break;
                }
            }}
        };
options.Parse(args);
于 2013-08-15T05:54:14.010 回答
5

接受单个参数的值列表的另一种方法是多次接受相同的参数。例如,

编 --file="c:\a\b\c.txt" --file="c:\prog 文件\d.txt"

在这种情况下,您的代码将如下所示。

List<string> fileList = new List<string>();

OptionSet options = new OptionSet
{
    { "f|file", "File name. Repeat argument for each file.", v =>
        {
            fileList.Add(v);
        }
    }
};

options.Parse(args);

恕我直言,此代码更易于阅读和维护。

于 2016-09-02T00:32:42.533 回答