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?

13voto

PeterH Punkte 171

Vor einiger Zeit habe ich einen C#-Befehlszeilen-Argument-Parser geschrieben. Seine bei: http://www.codeplex.com/CommandLineArguments

9voto

Colonel Panic Punkte 125419

CLAP (command line argument parser) hat eine brauchbare API und ist wunderbar dokumentiert. Sie erstellen eine Methode und geben die Parameter an. https://github.com/adrianaisemberg/CLAP

2 Stimmen

Es ist sehr einfach zu bedienen und die Website ist super. Ihre Syntax ist jedoch nicht sehr intuitiv: myapp myverb -argname argvalue (muss haben -argname ) oder myapp -help (in der Regel --help ).

0 Stimmen

@Wernight können Sie den IsDefault-Parameter auf das Verb anwenden, damit es weggelassen werden kann. Ich habe keine Unterstützung für Positionsparameter gefunden, aber ich habe nur Positionsparameter verwendet, wenn ich die Befehlszeile selbst geparst habe. Es ist viel klarer, benannte Argumente gefolgt von Werten zu verwenden, IMHO.

5voto

csharptest.net Punkte 58070

Es gibt zahlreiche Lösungen für dieses Problem. Der Vollständigkeit halber und um eine Alternative zu bieten, falls jemand dies wünscht, füge ich diese Antwort für zwei nützliche Klassen in meinem Google-Code-Bibliothek .

Die erste ist ArgumentList, die nur für das Parsen von Befehlszeilenparametern zuständig ist. Sie sammelt Name-Wert-Paare, die durch die Schalter '/x:y' oder '-x=y' definiert sind, und sammelt auch eine Liste 'unbenannter' Einträge. Grundlegend ist sie Verwendung wird hier erörtert , Hier können Sie sich den Kurs ansehen .

Der zweite Teil davon ist die Befehlsinterpreter die aus Ihrer .Net-Klasse eine voll funktionsfähige Befehlszeilenanwendung erstellt. Ein Beispiel:

using CSharpTest.Net.Commands;
static class Program
{
    static void Main(string[] args)
    {
        new CommandInterpreter(new Commands()).Run(args);
    }
    //example ‘Commands’ class:
    class Commands
    {
        public int SomeValue { get; set; }
        public void DoSomething(string svalue, int ivalue)
        { ... }

Mit dem obigen Beispielcode können Sie folgendes ausführen:

Programm.exe DoSomething "Zeichenfolge Wert" 5

-- oder --

Programm.exe dosomething /ivalue=5 -svalue: "string value"

Es ist so einfach oder so komplex, wie Sie es brauchen. Sie können Überprüfung des Quellcodes , die Hilfe ansehen , oder die Binärdatei herunterladen .

4voto

Xn0vv3r Punkte 17236

Ich mag die denn Sie können "Regeln" für die Argumente festlegen, ob sie benötigt werden oder nicht...

oder wenn Sie ein Unix-Typ sind, dann könnte Ihnen die GNU Getopt .NET Hafen.

4voto

Phill Tew Punkte 142

Vielleicht gefällt Ihnen mein Rug.Cmd

Einfach zu verwendender und erweiterbarer Parser für Befehlszeilenargumente. Behandelt: Bool, Plus / Minus, String, String-Liste, CSV, Aufzählung.

Eingebauter '/?'-Hilfemodus.

Eingebauter '/??'- und '/?D'-Dokumentengenerator-Modus.

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

Edit: Dies ist mein Projekt und als solches sollte diese Antwort nicht als Befürwortung einer dritten Partei angesehen werden. Dennoch verwende ich es für jedes kommandozeilenbasierte Programm, das ich schreibe. Es ist Open Source und ich hoffe, dass andere davon profitieren können.

0 Stimmen

Nur zu Ihrer Information: Sie sollten einen kleinen Disclaimer hinzufügen, dass Sie mit dem Rug.Cmd-Projekt verbunden sind (wie in den FAQ erwähnt): stackoverflow.com/faq#Werbung -- Keine große Sache, da Sie ein Open-Source-Projekt fördern, aber es ist trotzdem gut, einen Haftungsausschluss hinzuzufügen ;) Übrigens +1... sieht ziemlich gut gemacht aus.

0 Stimmen

Danke für den Hinweis und für die +1, ich werde meine Zugehörigkeit deutlicher machen.

0 Stimmen

Keine Sorge... es gibt da draußen einige Verfechter dieser Art von Dingen (ich gehöre nicht dazu), also möchte ich die Leute vorwarnen. Auch das ist normalerweise kein Problem für Open-Source-Projekte. Es geht hauptsächlich darum, Leute davon abzuhalten, Empfehlungen für ihre (bezahlten) Produkte zu spammen.

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