CommandLineParser for .NET

.NET Framework 2.0/3.xでコマンドラインの解析をちょっとだけ楽にするための再利用可能なコードです。ほかのプラットフォームにはoptgetとかいろいろあるのでそんな感じです。

例えば

class CommandOptions
{
    public String Host { get; set; }
    public Int32 Port { get; set; }
    public String Username { get; set; }
}

というようなコードを書くだけで

Sample.exe --host=localhost --port=80 --username=hauhau

というオプションを受け取れるものを作れます。

配布形態はソリューションですが、CommandLineParser.cs というファイルをプロジェクトに追加するだけで利用できます。

コード

http://coderepos.org/share/browser/lang/csharp/CommandLineParser/

つかいかた

はじめに

http://svn.coderepos.org/share/lang/csharp/CommandLineParser/CommandLineParser/CommandLineParser.cs

をプロジェクトに追加します。

そして、受け付けたいコマンドラインオプションを持つクラスを適当に定義します。 一つのオプションは一つのプロパティに相当します。例えば --host, --port --username を受け付けたいと言う場合は

    class CommandOptions
    {
        public String Host { get; set; }
        public Int32 Port { get; set; }
        public String Username { get; set; }
    }

こんな感じですね。クラス名は何でもよいです。

そして今度はプログラムからコマンドライン解析をしてみます。コマンドライン解析は Misuzilla.Utilities.ComanndLineParser<T> クラスを利用して行います。ジェネリクスパラメータ T にはコマンドラインオプションのクラスを指定します。さっきの例だとCommandOptions クラスです。

ということで以下のようになります。なおMain直下に書いてる前提です。

CommandOptions commandOptions;
CommandLineParser<CommandOptions> parser = new CommandLineParser<CommandOptions>();
if (parser.TryParse(args, out commandOptions))
{
    // 成功
}
else
{
    // 失敗
    parser.ShowHelp();
}

TryParse メソッドで解析を実行します。一つ目の引数にはコマンドライン引数、二つ目の引数には解析成功時の結果が入る変数、戻り値が解析の成功かどうかとなっています。

失敗した場合にはShowHelp メソッドでコマンドライン引数一覧を出力します。このメッセージはコマンドラインオプションクラスから勝手に作り出してくれます。

で、これでコンパイルして実行すると見事にShowHelpの結果が出てくると思います。

--host=(String)    : (Required)
--port=(Int32)     : (Required)
--username=(String): (Required)

なぜかというと特にデフォルト値がないものは全部必須扱いだからです。ということなので

Sample.exe --host=localhost --port=80 --username=hauhau

とすると何の文句も出ずに終了するはずです。

次は必須でなくしてみます。とりあえずPort(--port)を省略できるようにします。

オプションを省略するにはデフォルト値を指定すればよいのです。デフォルト値を指定するにはSystem.ComponentModel.DefaultValueAttribute というナイス属性を使います。

    class CommandOptions
    {
        public String Host { get; set; }

        [DefaultValue(16668)]
        public Int32 Port { get; set; }

        public String Username { get; set; }
    }

こんな感じ。これで --port オプションを特に指定しなかった場合には Port に 16668 が入ります。

(待て次号!)