¿La mejor manera de analizar argumentos de línea de comando en C#? [cerrado]

Resuelto Paul Stovell asked hace 15 años • 20 respuestas

Al crear aplicaciones de consola que toman parámetros, puede utilizar los argumentos pasados ​​a Main(string[] args).

En el pasado, simplemente indexé/recorrí esa matriz y realicé algunas expresiones regulares para extraer los valores. Sin embargo, cuando los comandos se vuelven más complicados, el análisis puede volverse bastante feo.

Entonces estoy interesado en:

  • Bibliotecas que usas
  • Patrones que usas

Suponga que los comandos siempre cumplen con estándares comunes, como los que se responden aquí .

Paul Stovell avatar Jan 29 '09 20:01 Paul Stovell
Aceptado

Recomiendo encarecidamente utilizar NDesk.Options ( Documentación ) y/o Mono.Options (misma API, diferente espacio de nombres). Un ejemplo de la documentación :

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;
}
jonp avatar Jan 14 '2010 22:01 jonp

Realmente me gusta la biblioteca del analizador de línea de comandos ( http://commandline.codeplex.com/ ). Tiene una forma muy sencilla y elegante de configurar parámetros mediante atributos:

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();
    }
}
Adrian Grigore avatar Sep 07 '2011 07:09 Adrian Grigore