Suchen nach einem Befehlszeilenargument-Parser für .NET [geschlossen]

79

Ich suche nach einem Befehlszeilenargument-Parser wie "Befehlszeilen-Parser" von http://www.sellsbrothers.com/tools/Genghis/ .

Features, die ich suche:

  • Automatische Generierung der Nutzung
  • Sollte in der Lage sein, erforderliche und optionale Parameter zu überprüfen
  • Die Parameter sollten IEnumerable mit Trennzeichen unterstützen
  • Sollte Flag-Parameter unterstützen
  • Wäre schön, das Kombinieren von Parametern wie "/ fx" == "/ f / x" zu unterstützen.
  • Es wäre schön, nach einem Parameter wie "/ftest.txt" == "/ f test.txt" kein Leerzeichen zu erzwingen.

PS: "Command Line Parser" ist ziemlich gut, ich mag das Design sehr, aber es gibt keine Dokumentation, keine neuen Updates und ich konnte nicht herausfinden, wie man bestimmte Dinge erledigt, wie man nach erforderlichen Parametern sucht.

DR. böse
quelle
Der flexibelste .NET-Befehlszeilenparser scheint zu sein: gsscoders CommandLineParser
AlexMelw

Antworten:

52

Meine persönliche Lieblings-Kommandozeilen-Parsing-Bibliothek von Drittanbietern ist Command Line Parser, und ich gehe davon aus, dass dies diejenige ist, auf die Sie sich beziehen. Die letzte Veröffentlichung war vor weniger als 2 Monaten und es gibt regelmäßige Commits. Wenn Sie ein ausgereifteres Angebot wünschen, können Sie die Konsolenbibliothek im Mono-Projekt durchsuchen (leider kann ich momentan keinen direkten Link zum Namespace finden, aber es ist Teil des Mono-Frameworks).

Raoul
quelle
1
Das sieht gut aus, ich werde es versuchen.
dr. böse
Ich versuche dies zu implementieren. Unterstützt es "Flag" -Argumente? wie "-enable", für das kein Wert erforderlich ist, sondern nur wahres / falsches Zeug. Ich konnte es nicht finden.
dr. böse
Wenn ich mich recht erinnere, ist es nicht sofort einsatzbereit, aber es sollte nicht zu viel Arbeit sein, den Parser so zu ändern, dass nach nicht qualifizierten Schaltern für boolesche Werte gesucht wird, anstatt zu erwarten, dass true / false angegeben wird.
Raoul
Der Mono-Parser heißt übrigens Mono.GetOptions. Das unterstützt definitiv, wonach Sie suchen. Sie können nur diesen Teil der Mono-Framework-Quelle herunterladen, erstellen und als Alternative in Ihrem Projekt referenzieren.
Raoul
Ich habe diese Bibliothek selbst benutzt und bin damit einverstanden, dass es eine ausgezeichnete Bibliothek ist.
Noldorin
20

Schauen Sie sich ndesk.options an.

Es heißt jetzt Mono.Options .

John
quelle
3
Wir haben ndesk.options mit viel Erfolg verwendet. Es ist eine einzelne Klasse, die Sie einfach in Ihren Code kompilieren können: ndesk.org/Options
Sean Carpenter
Derzeit wird auf ihrer Website eine Warnung angezeigt, dass NDesk.Options instabil ist. Nur eine Warnung ... vielleicht eine ältere Version verwenden.
Kilhoffer
Ich habe auch gute Erfahrungen mit NDesk.Options gemacht. Es ist Perls Getopt :: Long nachempfunden (was ausgezeichnet ist).
JWD
5

Ein beliebter und ziemlich umfassender C-Befehlszeilenparser ist GNU getopt . Dies wurde mehrmals für C # /. Net portiert (oder geklont). Einige davon sind:

Treffen Sie Ihre Wahl! Es gibt mehrere andere, und Google kann Ihnen davon erzählen,

Stewart
quelle
4

Leider gibt es keine eingebaute Unterstützung für die normale Handhabung. Haben Sie sich mit PowerShell befasst? Ich wette, es gibt eine Klasse in dieser Shell, die genau das tut, was Sie wollen oder ähnliches.

John Leidegren
quelle
Ja, PowerShell ist wahrscheinlich in den meisten Fällen der richtige Weg. Das Schreiben eines Cmdlets ist ziemlich einfach, eröffnet jedoch so viele Möglichkeiten mit wenig oder gar keiner Arbeit.
John Saunders
Ich bin mir nicht ganz sicher, was du mit Powershell meinst. Es ist kein Open Source oder meinst du, ich finde möglicherweise ein Cmdlet und konvertiere es in die .NET-Syntax.
dr. böse
3
Ich denke, er meint "Schreiben Sie Ihren Code als PowerShell-Cmdlet anstelle einer eigenständigen ausführbaren Datei."
Joel Mueller
Mein heutiger Standardplan besteht darin, befehlszeilenorientierte Programme als Powershell-Cmdlets zu schreiben. Auf diese Weise muss ich mir keine Gedanken darüber machen, wie die Befehlszeile analysiert wird.
Peter Stephens
Ich denke, Powerhells Arg-Parsing ist schrecklich.
Tim Abell
2

Bearbeiten: Wie fatcat1111 hervorhebt, wurde diese Funktion nicht mit der endgültigen Version von .net 4.0 ausgeliefert.

C # 4.0 hat eine ziemlich gute. Wahrscheinlich noch nicht sehr hilfreich, aber vielleicht möchten Sie sich etwas ansehen, das den Sprung zum eingebauten Gerät erleichtert, wenn es herauskommt. Bart De Smet hat in seinem B # -Blog darüber gesprochen

Mike Zwei
quelle
2
System.Shell.CommandLine wurde schließlich aus Version 4 des Frameworks entfernt.
Justin R.
1

Bedenken Sie, dass Sie diesen Parser, sobald Sie ihn verwenden, entweder selbst warten müssen oder von jemand anderem abhängig sind, um ihn für Sie zu warten. Sie sind möglicherweise besser dran, Ihre eigenen zu schreiben, beginnend mit Ihren kritischsten, unmittelbarsten Anforderungen. Ich habe festgestellt, dass es nicht allzu viel Arbeit kostet, für die meisten konsolenbasierten Anwendungen, an denen ich gearbeitet habe, eine ziemlich komplizierte Befehlszeilenanalyse zu erstellen.

Ich habe auch festgestellt, dass es möglicherweise an der Zeit ist, die Befehlszeile nicht mehr zu verwenden, wenn das Parsen zu kompliziert wird.

John Saunders
quelle
1
Da dies ein bekanntes Problem ist und fast ein Muss für jedes einzelne Kommandozeilen-Tool ist, ging ich davon aus, dass es einige ausgereifte Lösungen geben sollte, und dass ich meinen eigenen Sound ein wenig pflegen und schreiben sollte, um meine Zeit zu verbringen. Aber hey, da es hier nicht genug Antworten gibt, haben Sie vielleicht Recht.
dr. böse
1
@ Downvoter: -2 rep stört mich nicht. Wenn Sie etwas bewirken möchten, geben Sie bitte den Grund für die Ablehnung an.
John Saunders
1

Ich wette, das ist nicht ganz das, wonach Sie suchen, aber:

Jemand hier hatte dieses Problem, und sein erster Gedanke war "hey, ocaml hat einen ziemlich guten!" Und portierte ihn schnell auf F #.

Ken
quelle
+1 github.com/nessos/UnionArgParser ist ein ziemlich gutes Beispiel
Ruben Bartelink
1

Ich verwende den Parser aus dem C # 3.0-Kochbuch.

Alle Beispiele aus diesem Buch können hier heruntergeladen werden: http://examples.oreilly.com/9780596516109/

Suchen Sie nach "Argumente" und Sie werden es finden. Sie müssen einige kleine Codeänderungen vornehmen, um das Ganze in Ihre eigene Klasse zu bringen, aber das ist kein großes Problem.

Es unterstützt alle Ihre Punkte mit Ausnahme der letzten beiden (Parameter kombinieren & fehlender Platz).

Oliver
quelle
1

Die BizArk-Bibliothek enthält einen Befehlszeilenparser.

Grundsätzlich erstellen Sie einfach eine Klasse, die von CmdLineObject erbt, fügen Eigenschaften hinzu, die über die Befehlszeile ausgefüllt werden sollen, fügen den Eigenschaften ein CmdLineArgAttribute hinzu und rufen dann Initialize in Ihrem Programm auf. Es unterstützt auch ClickOnce-URL-Argumente!

Funktionen (von der Website) ...

  • Automatische Initialisierung: Klasseneigenschaften werden automatisch basierend auf den Befehlszeilenargumenten festgelegt.
  • Standardeigenschaften: Senden Sie einen Wert ohne Angabe des Eigenschaftsnamens.
  • Wertekonvertierung: Verwendet die leistungsstarke ConvertEx-Klasse, die auch in BizArk enthalten ist, um Werte in den richtigen Typ zu konvertieren.
  • Boolesche Flags. Flags können durch einfaches Verwenden des Arguments (z. B. / b für true und / b- für false) oder durch Hinzufügen des Werts true / false, yes / no usw. angegeben werden.
  • Argument-Arrays. Fügen Sie einfach mehrere Werte nach dem Befehlszeilennamen hinzu, um eine Eigenschaft festzulegen, die als Array definiert ist. Beispiel: / x 1 2 3 füllt x mit dem Array {1, 2, 3} (vorausgesetzt, x ist als Array von ganzen Zahlen definiert).
  • Befehlszeilen-Aliase: Eine Eigenschaft kann mehrere Befehlszeilen-Aliase unterstützen. In der Hilfe wird beispielsweise der Alias? Verwendet.
  • Teilweise Namenserkennung. Sie müssen nicht den vollständigen Namen oder Alias ​​buchstabieren, sondern nur so viel, dass der Parser die Eigenschaft / den Alias ​​von den anderen unterscheiden kann.
  • Unterstützt ClickOnce: Kann Eigenschaften initialisieren, auch wenn sie als Abfragezeichenfolge in einer URL für von ClickOnce bereitgestellte Anwendungen angegeben sind. Die Befehlszeileninitialisierungsmethode erkennt, ob sie als ClickOnce ausgeführt wird oder nicht, sodass sich Ihr Code bei der Verwendung nicht ändern muss.
  • Erstellt automatisch /? Hilfe: Dies beinhaltet eine nette Formatierung, die die Breite der Konsole berücksichtigt.
  • Laden / Speichern von Befehlszeilenargumenten in eine Datei: Dies ist besonders nützlich, wenn Sie mehrere große, komplexe Sätze von Befehlszeilenargumenten haben, die Sie mehrmals ausführen möchten.
Brian
quelle
0

Ich bin ein Fan des C # -Ports für OptParse, eine in Python integrierte Bibliothek. Es ist im Vergleich zu den meisten anderen Vorschlägen hier recht einfach zu verwenden und enthält neben der automatischen Analyse eine Reihe nützlicher Funktionen.

Daniel Goldberg
quelle
0

Vielleicht gefällt dir mein einziger Rug.Cmd

Einfach zu verwendender und erweiterbarer Befehlszeilenargument-Parser. Handles: Bool, Plus / Minus, String, String-Liste, CSV, Aufzählung.

Eingebaut in '/?' Hilfemodus.

Eingebaut in '/ ??' und '/? D' Dokumentgenerator-Modi.

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);
        }
    }
}

Bearbeiten: Dies ist mein Projekt und als solches sollte diese Antwort nicht als Bestätigung durch einen Dritten angesehen werden. Das heißt, ich benutze es für jedes Kommandozeilen-basierte Programm, das ich schreibe, es ist Open Source und ich hoffe, dass andere davon profitieren können.

Phill Tew
quelle