4

私は NDesk.Options ライブラリが初めてです。アイテムの単純なリストを解析する最も簡単な方法がわかりません。

例: prog --items=item1 item2 item3 (コードで List アイテムを使用したい)

アイテムリストをファイル名またはディレクトリ名のリストとして使用したいだけでなく、引用もサポートする必要があります。

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」フラグを設定し、フラグのない後続の入力がリストの一部であると想定できます。入力ファイルとしてリストを指定し、キーと値のペアのリストであるディクショナリ (パラメーター) を指定できる例を次に示します。もちろん他のバリエーションもご用意しております。

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

1 つの引数に対して値のリストを受け入れる代わりに、同じ引数を複数回受け入れることもできます。例えば、

prog --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 に答える