c# line parser - La meilleure façon d'analyser les arguments de la ligne de commande en C #?




10 Answers

Je suggère fortement d'utiliser NDesk.Options ( Documentation ) et / ou Mono.Options (même API, espace de noms différent). Un exemple de la documentation :

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;
}
args parameter

Lors de la création d'applications console prenant des paramètres, vous pouvez utiliser les arguments transmis à Main(string[] args) .

Dans le passé, j'ai simplement indexé / bouclé ce tableau et fait quelques expressions régulières pour extraire les valeurs. Cependant, quand les commandes deviennent plus compliquées, l'analyse peut devenir très moche.

Donc je suis intéressé par:

  • Bibliothèques que vous utilisez
  • Les modèles que vous utilisez

Supposons que les commandes respectent toujours les normes communes telles que celles indiquées ici .




La bibliothèque WPF TestApi est fournie avec l'un des plus beaux parseurs de ligne de commande pour le développement C #. Je vous recommande vivement d'y jeter un coup d' œil, sur le blog d' Ivo Manolov sur l'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);



On dirait que tout le monde a ses propres analyseurs de ligne de commande pour animaux de compagnie, la figure que je ferais mieux d'ajouter le mien aussi bien :).

http://bizark.codeplex.com/

Cette bibliothèque contient un analyseur de ligne de commande qui va initialiser une classe avec les valeurs de la ligne de commande. Il a une tonne de fonctionnalités (je l'ai construit sur de nombreuses années).

De la documentation ...

L'analyse de ligne de commande dans le framework BizArk possède les fonctionnalités suivantes:

  • Initialisation automatique: les propriétés de classe sont automatiquement définies en fonction des arguments de la ligne de commande.
  • Propriétés par défaut: Envoie une valeur sans spécifier le nom de la propriété.
  • Conversion de valeur: Utilise la puissante classe ConvertEx incluse dans BizArk pour convertir les valeurs dans le bon type.
  • Drapeaux booléens: Les drapeaux peuvent être spécifiés en utilisant simplement l'argument (ex, / b pour vrai et / b- pour faux) ou en ajoutant la valeur vrai / faux, oui / non, etc.
  • Tableaux d'arguments: ajoutez simplement plusieurs valeurs après le nom de la ligne de commande pour définir une propriété définie en tant que tableau. Ex, / x 1 2 3 peuplera x avec le tableau {1, 2, 3} (en supposant que x est défini comme un tableau d'entiers).
  • Alias ​​de ligne de commande: une propriété peut prendre en charge plusieurs alias de ligne de commande. Par exemple, l'aide utilise l'alias?
  • Reconnaissance partielle de nom: Vous n'avez pas besoin d'épeler le nom complet ou l'alias, juste épeler suffisamment pour que l'analyseur désambiguïste la propriété / alias des autres.
  • Prend en charge ClickOnce: peut initialiser les propriétés même lorsqu'elles sont spécifiées en tant que chaîne de requête dans une URL pour les applications déployées ClickOnce. La méthode d'initialisation de la ligne de commande détectera si elle s'exécute en tant que ClickOnce ou non, ce qui signifie que votre code n'a pas besoin de changer lors de son utilisation.
  • Crée automatiquement /? help: Cela inclut une bonne mise en forme qui prend en compte la largeur de la console.
  • Charger / Enregistrer des arguments de ligne de commande dans un fichier: Ceci est particulièrement utile si vous avez plusieurs jeux complexes et complexes d'arguments de ligne de commande que vous souhaitez exécuter plusieurs fois.



CLAP (analyseur d'argument de ligne de commande) a une API utilisable et est merveilleusement documenté. Vous faites une méthode, annotant les paramètres. https://github.com/adrianaisemberg/CLAP




J'aime celui-là , parce que vous pouvez "définir des règles" pour les arguments, nécessaires ou non, ...

ou si vous êtes un gars Unix, vous aimerez peut-être le port GNU Getopt .NET .




Il y a un analyseur d'argument de ligne de commande à http://www.codeplex.com/commonlibrarynet

Il peut analyser les arguments en utilisant
1. attributs
2. appels explicites
3. ligne unique d'arguments multiples OR tableau de chaînes

Il peut gérer des choses comme les suivantes:

- config : Qa - startdate : $ { today } - région : 'New York' Settings01

C'est très facile à utiliser.




Mon préféré est http://www.codeproject.com/KB/recipes/plossum_commandline.aspx par Peter Palotas:

[CommandLineManager(ApplicationName="Hello World",
    Copyright="Copyright (c) Peter Palotas")]
class Options
{
   [CommandLineOption(Description="Displays this help text")]
   public bool Help = false;

   [CommandLineOption(Description = "Specifies the input file", MinOccurs=1)]
   public string Name
   {
      get { return mName; }
      set
      {
         if (String.IsNullOrEmpty(value))
            throw new InvalidOptionValueException(
                "The name must not be empty", false);
         mName = value;
      }
   }

   private string mName;
}






Gengis Command Line Parser peut être un peu démodé, mais il est très complet et fonctionne plutôt bien pour moi.







Related