731 Stimmen

Beste Weg, um Befehlszeilenargumente in C# zu parsen?

Wenn Sie Konsolenanwendungen erstellen, die Parameter benötigen, können Sie die Argumente verwenden, die an Main(string[] args) .

In der Vergangenheit habe ich einfach indiziert/geschleift, dass Array und tat ein paar reguläre Ausdrücke, um die Werte zu extrahieren. Wenn die Befehle jedoch komplizierter werden, kann das Parsing ziemlich unschön werden.

Ich bin also interessiert:

  • Bibliotheken, die Sie verwenden
  • Muster, die Sie verwenden

Gehen Sie davon aus, dass sich die Befehle immer an gemeinsame Standards halten, wie z. B. hier beantwortet .

0 Stimmen

Eine frühere Diskussion, split-string-enthalten-kommandozeilen-parameter-in-string-in-c# hat vielleicht einige Antworten.

1 Stimmen

Hallo, tut mir leid, es ist ein bisschen off-topic. aber ich benutze die "Anwendungseinstellungen", um Argumente an die Anwendung zu übergeben. Ich fand es ziemlich einfach zu bedienen und keine Notwendigkeit, Argument/Datei-Parsing zu schreiben, und keine Notwendigkeit für zusätzliche Bibliothek. msdn.microsoft.com/de-us/library/aa730869(VS.80).aspx

44 Stimmen

@call me Steve: Der Sinn von Kommandozeilenargumenten ist, dass sie bei jedem Aufruf variieren können - wie machen Sie das mit den Anwendungseinstellungen?

324voto

jonp Punkte 13432

Ich würde dringend empfehlen, Folgendes zu verwenden NDesk.Optionen ( Dokumentation ) und/oder Mono.Optionen (gleiche API, anderer Namensraum). Eine Beispiel aus der Dokumentation :

bool show_help = false;
List<string> names = new List<string> ();
int repeat = 1;

var p = new OptionSet () {
    { "n|name=", "the {NAME} of someone to greet.",
       v => names.Add (v) },
    { "r|repeat=", 
       "the number of {TIMES} to repeat the greeting.\n" + 
          "this must be an integer.",
        (int v) => repeat = v },
    { "v", "increase debug message verbosity",
       v => { if (v != null) ++verbosity; } },
    { "h|help",  "show this message and exit", 
       v => show_help = v != null },
};

List<string> extra;
try {
    extra = p.Parse (args);
}
catch (OptionException e) {
    Console.Write ("greet: ");
    Console.WriteLine (e.Message);
    Console.WriteLine ("Try `greet --help' for more information.");
    return;
}

14 Stimmen

NDesk.options ist großartig, scheint aber Konsolenanwendungen mit mehr als einem eindeutigen Befehl nicht wirklich gut zu unterstützen. Wenn Sie das wollen, versuchen Sie ManyConsole, das auf NDesk.Options aufbaut: nuget.org/Liste/Pakete/ManyConsole

5 Stimmen

Wenn ich eine Anwendung mit mehreren unterschiedlichen Befehlen habe, schichte ich die OptionSets. Nehmen Sie mdoc ( docs.go-mono.com/index.aspx?link=man%3amdoc%281%29 ), die ein "globales" OptionSet hat ( github.com/mono/mono/blob/master/mcs/tools/mdoc/ ), die an ein OptionSet pro Befehl delegiert (z. B. github.com/mono/mono/blob/master/mcs/tools/mdoc/ )

3 Stimmen

NDesk arbeitet nicht für mich. Ich konnte zwar Integer-Argumente lesen, aber keine Strings. Die Variablen erhalten immer die Argumente (z. B. 's', 'a' usw.) anstelle der Argumentwerte (z. B. 'serverName', 'ApplicationName'). Ich habe aufgegeben und stattdessen die 'Command Line Parser Library' verwendet. So weit ok.

197voto

Adrian Grigore Punkte 32344

Besonders gut gefällt mir die Command Line Parser Library ( http://commandline.codeplex.com/ ). Es bietet eine sehr einfache und elegante Möglichkeit, Parameter über Attribute einzurichten:

class Options
{
    [Option("i", "input", Required = true, HelpText = "Input file to read.")]
    public string InputFile { get; set; }

    [Option(null, "length", HelpText = "The maximum number of bytes to process.")]
    public int MaximumLenght { get; set; }

    [Option("v", null, HelpText = "Print details during execution.")]
    public bool Verbose { get; set; }

    [HelpOption(HelpText = "Display this help screen.")]
    public string GetUsage()
    {
        var usage = new StringBuilder();
        usage.AppendLine("Quickstart Application 1.0");
        usage.AppendLine("Read user manual for usage instructions...");
        return usage.ToString();
    }
}

6 Stimmen

Auch ich habe mich für diese Bibliothek entschieden. Ich schreibe Anwendungen für ein großes Unternehmen, die über viele Jahre hinweg gepflegt werden müssen - diese Bibliothek wird seit 2005 kontinuierlich aktualisiert, scheint beliebt zu sein, wird von Leuten geschrieben, die in der C#-Community aktiv sind, und ist im BSD-Stil lizenziert, falls der Support verschwindet.

0 Stimmen

Ich empfehle dies auch. Mein einziges Problem war: Die Angabe der zulässigen Argumentkombinationen (z.B. wenn das Argument move auch die Argumente source und dest haben muss) Mai mit Attributen möglich sein. Aber Sie vielleicht besser tun es mit separaten Argument Validator Logik

1 Stimmen

Ich mag den Kurs "Optionen". Sie scheint unbenannte Parameter und Flags zu unterstützen wie --recursive auch.

50voto

user7116 Punkte 61589

El WPF TestApi-Bibliothek wird mit einem der besten Kommandozeilen-Parser für die C#-Entwicklung geliefert. Ich empfehle dringend einen Blick darauf zu werfen, von Ivo Manolovs Blog über die API :

// EXAMPLE #2:
// Sample for parsing the following command-line:
// Test.exe /verbose /runId=10
// This sample declares a class in which the strongly-
// typed arguments are populated
public class CommandLineArguments
{
   bool? Verbose { get; set; }
   int? RunId { get; set; }
}

CommandLineArguments a = new CommandLineArguments();
CommandLineParser.ParseArguments(args, a);

19 Stimmen

+1. Das Parsen von Befehlszeilen ist etwas, das wirklich vom Hersteller (z. B. Microsoft) kommen sollte und nicht über ein Tool eines Drittanbieters, selbst wenn die Unterstützung durch den Hersteller auf Umwegen erfolgt.

2 Stimmen

Dennoch ist die akzeptierte Antwort (Mono) die nächstbeste Lösung.

6 Stimmen

@Joel, welcher Teil ist so wichtig, dass das Parsen der Befehlszeile vom Hersteller kommen muss? Was sind Ihre Gründe?

24voto

abatishchev Punkte 94886

2 Stimmen

NDesk-Optionen haben eine sehr gute API

2 Stimmen

Ich füge eine weitere Stimme für NDesk hinzu. Es funktioniert gut, ist nicht aufdringlich und gut dokumentiert.

1 Stimmen

Mono.GetOptions ist sehr alt, NDesk.Options ist viel schöner (oder Mono.Options, wenn Sie bevorzugen, es ist die gleiche Klasse, hier: anonsvn.mono-project.com/source/trunk/mcs/class/Mono.Options/ )

14voto

Brian Punkte 36229

Wie es aussieht, hat jeder seine eigenen Lieblings-Befehlszeilen-Parser, also sollte ich meinen auch hinzufügen :).

http://bizark.codeplex.com/

Diese Bibliothek enthält eine Kommandozeilen-Parser die eine Klasse mit den Werten aus der Befehlszeile initialisiert. Es hat eine Vielzahl von Funktionen (ich habe es über viele Jahre hinweg aufgebaut).

Von der Dokumentation ...

Das Kommandozeilen-Parsing im BizArk-Framework hat folgende Hauptmerkmale:

  • Automatische Initialisierung: Die Klasseneigenschaften werden automatisch auf der Grundlage der Befehlszeilenargumente festgelegt.
  • Standard-Eigenschaften: Senden Sie einen Wert ohne Angabe des Eigenschaftsnamens.
  • Wertumwandlung: Verwendet die leistungsstarke ConvertEx-Klasse, die auch in BizArk enthalten ist, um Werte in den richtigen Typ zu konvertieren.
  • Boolesche Flaggen: Flags können einfach durch die Verwendung des Arguments (z. B. /b für true und /b- für false) oder durch Hinzufügen der Werte true/false, yes/no usw. angegeben werden.
  • Argument-Arrays: Fügen Sie einfach mehrere Werte nach dem Befehlszeilennamen ein, 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 Ganzzahlen definiert).
  • Kommandozeilen-Aliase: Eine Eigenschaft kann mehrere Befehlszeilen-Aliase für sie unterstützen. Zum Beispiel verwendet Help den Alias ?.
  • Teilweiser Bekanntheitsgrad: 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 auch dann initialisieren, wenn sie als Abfragezeichenfolge in einer URL für mit ClickOnce bereitgestellte Anwendungen angegeben sind. Die Befehlszeilen-Initialisierungsmethode erkennt, ob sie als ClickOnce ausgeführt wird oder nicht, sodass Ihr Code nicht geändert werden muss, wenn Sie sie verwenden.
  • Erzeugt automatisch /? Hilfe: Dazu gehört eine schöne Formatierung, die die Breite der Konsole berücksichtigt.
  • Laden/Speichern von Kommandozeilenargumenten in eine Datei: Dies ist besonders nützlich, wenn Sie mehrere große, komplexe Sätze von Befehlszeilenargumenten haben, die Sie mehrfach ausführen wollen.

2 Stimmen

Ich fand den Kommandozeilenparser von BizArk viel einfacher und flüssiger als andere. Äußerst empfehlenswert!

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X