web-dev-qa-db-ja.com

.NET用のコマンドライン引数パーサーを探しています

http://www.sellsbrothers.com/tools/Genghis/ の「コマンドラインパーサー」などのコマンドライン引数パーサーを探しています。

私が探している機能:

  • 使用量の自動生成
  • 必須およびオプションのパラメーターを確認できる必要があります
  • パラメーターは、セパレーターをサポートするIEnumerableをサポートする必要があります
  • フラグパラメータをサポートする必要があります
  • "/ fx" == "/ f/x"などのパラメーターの組み合わせをサポートできたらうれしいです
  • "/ftest.txt" == "/ f test.txt"などのパラメーターの後にスペースを強制しないのは良いことです

PS:「コマンドラインパーサー」は非常に優れており、そのデザインはとても気に入っていますが、ドキュメントも新しいアップデートもありません。必要なパラメーターを確認します

79
dr. evil

私の個人的なお気に入りのサードパーティのコマンドライン解析ライブラリは Command Line Parser であり、これがあなたが参照しているものだと思います。最新のリリースは2か月未満前であり、定期的なコミットがあります。より成熟した製品が必要な場合は、monoプロジェクトのコンソールライブラリをチェックアウトできます(現時点では名前空間への直接リンクは見つかりませんが、monoフレームワークの一部です)

52
Raoul

Ndesk.optionsをご覧ください。

現在は Mono.Options と呼ばれています。

20
John

人気のある非常に包括的なCコマンドラインパーサーは GNU getopt です。これは、C#/。Net向けに何度か移植(または複製)されています。これらのいくつかが含まれます:

好きなのを選びな!他にもいくつかあり、グーグルはそれらについてあなたに伝えることができます、

5
Stewart

悲しいことに、標準的な方法でそれを処理するための組み込みのサポートはありません。 PowerShellを調べましたか?そのシェルには、あなたが望んでいることと似たようなことを正確に行うクラスがあるに違いありません。

4
John Leidegren
2
danyolgiax

Edit:fatcat1111が指摘するように、この機能は.net 4.0の最終バージョンには付属していませんでした。

C#4.0にはかなり良いものがあります。おそらくまだあまり役に立たないかもしれませんが、組み込まれたものへのジャンプが簡単になったときに何かを検討することを検討する必要があります。バートデスメットは B#ブログ でそれについて話しました。

2
Mike Two

C#3.0クックブックのパーサーを使用しています。

この本のすべての例は、ここからダウンロードできます。 http://examples.oreilly.com/9780596516109/

「引数」を検索してください。それをすべて自分のクラスに入れるために、いくつかの小さなコード変更を行う必要がありますが、これは大きな問題ではありません。

最後の2つを除くすべてのポイントをサポートします(パラメーターの組み合わせとスペースの不足)。

1
Oliver

BizArkライブラリ には、コマンドラインパーサーが含まれています。

基本的には、CmdLineObjectを継承するクラスを作成し、コマンドラインから設定するプロパティを追加し、CmdLineArgAttributeをプロパティに追加してから、プログラムでInitializeを呼び出します。 ClickOnce URL引数もサポートしています!

機能(サイトから)...

  • 自動初期化:クラスプロパティは、コマンドライン引数に基づいて自動的に設定されます。
  • デフォルトのプロパティ:プロパティ名を指定せずに値を送信します。
  • 値の変換:BizArkにも含まれている強力なConvertExクラスを使用して、値を適切な型に変換します。
  • ブールフラグ。フラグを指定するには、単に引数を使用するか(例、trueの場合は/ b、falseの場合は/ b-)、true/false、yes/noなどの値を追加します。
  • 引数配列。コマンドライン名の後に複数の値を追加して、配列として定義されているプロパティを設定します。たとえば、/ x 1 2 3はxに配列{1、2、3}を挿入します(xが整数の配列として定義されていると仮定)。
  • コマンドラインエイリアス:プロパティは、複数のコマンドラインエイリアスをサポートできます。たとえば、ヘルプはエイリアス?を使用します。
  • 部分的な名前認識。氏名やエイリアスを入力する必要はありません。パーサーが他のプロパティ/エイリアスを明確にするのに十分なだけ入力してください。
  • ClickOnceをサポート:ClickOnceデプロイ済みアプリケーションのURLでクエリ文字列として指定されている場合でも、プロパティを初期化できます。コマンドライン初期化メソッドは、ClickOnceとして実行されているかどうかを検出するため、使用時にコードを変更する必要はありません。
  • /?を自動的に作成しますヘルプ:これには、コンソールの幅を考慮したニース形式が含まれます。
  • ファイルへのコマンドライン引数のロード/保存:これは、複数回実行するコマンドライン引数の大規模で複雑なセットが複数ある場合に特に便利です。
1
Brian

このパーサーの使用を開始したら、自分でメンテナンスするか、他の人に頼ってメンテナンスしてもらう必要があることを考慮してください。最も重要で差し迫った要件から始めて、独自に作成した方がよい場合があります。私が取り組んできたほとんどのコンソールベースのアプリケーションのために、かなり複雑なコマンドライン解析を作成するのにそれほど多くの作業を必要としないことがわかりました。

また、解析が複雑になりすぎると、コマンドラインの使用をやめるときが来ることもわかりました。

1
John Saunders

私はこれがあなたが探しているものではないことを賭けていますが、:

ここで誰かがその問題を抱えており、彼の最初の考えは「おい、ocamlにはかなり良いものがある!」というもので、すぐにF#に移植しました。

1
Ken

あなたは私のものを好きかもしれません Rug.Cmd

使いやすく、拡張可能なコマンドライン引数パーサー。ハンドル:Bool、Plus/Minus、String、String List、CSV、列挙。

組み込みの「/?」ヘルプモード。

組み込みの「/ ??」および「/?D」ドキュメントジェネレーターモード。

static void Main(string[] args) 
{            
    // create the argument parser
    ArgumentParser parser = new ArgumentParser("ArgumentExample", "Example of argument parsing");

    // create the argument for a string
    StringArgument StringArg = new StringArgument("String", "Example string argument", "This argument demonstrates string arguments");

    // add the argument to the parser 
    parser.Add("/", "String", StringArg);

    // parse arguemnts
    parser.Parse(args);

    // did the parser detect a /? argument 
    if (parser.HelpMode == false) 
    {
        // was the string argument defined 
        if (StringArg.Defined == true)
        {
            // write its value
            RC.WriteLine("String argument was defined");
            RC.WriteLine(StringArg.Value);
        }
    }
}

編集:これは私のプロジェクトであり、そのため、この回答は第三者からの支持と見なされるべきではありません。それは私が書いているすべてのコマンドラインベースのプログラムにそれを使用するということです、それはオープンソースであり、他の人がそれから利益を得ることが私の希望です。

0
Phill Tew

私は、Pythonの組み込みライブラリであるOptParseへのC#ポートのファンです。ここにある他の提案のほとんどと比較して使用するのはかなり簡単で、自動解析だけでなく多くの便利な機能が含まれています。

0
Daniel Goldberg