vtortola.NET Logo
Parsear los argumentos de la linea de comando

Parsear los argumentos de la linea de comando

por vtortola lunes, 17 de marzo de 2008

Para determinadas situaciones, es más útil parametrizar nuestras aplicaciones desde los argumentos que pasamos al ejecutable que desde un archivo de configuración, sobre todo si es una aplicación de consola. El problema suele ser que lo que nos llega a nuestra aplicación es un array de cadenas y nosotros debemos relacionarlas entre ellas, pudiendo haber distintos tipos de elemetos como modificadores, parámetros, parámetros de los modificadores y distintas cantidades de ambos tipos de parámetros.

Este es un ejemplo de como ordenarlos obteniendo una estructura en la que todo esta ordenado en forma jerárquica para poder consultar fácilmente parámetros, modificadores y parámetros de los modificadores, la función devuelve una clase de este tipo:

public class CommandLineArguments
{
    public List<String> Parameters { get; private set; }
    public Dictionary<String, List<String>> Modifiers { get; private set; }
 
    public CommandLineArguments()
    {
        this.Parameters = new List<String>();
        this.Modifiers = new Dictionary<String, List<String>>();
    }
}

La función recorre el array de argumentos (args[]) identificando cada uno por su relación y posición y colocandolo en la clase anterior:

delegate void ModParFinder_(String key, Int32 current);
static CommandLineArguments ParseParameters(String[] args, Char modIndicator)
{
    CommandLineArguments cmdArgs = new CommandLineArguments();
 
    // Busca los parametros de un modificador y los 
    // añade a la clave dada
    ModParFinder_ ModParFinder =
        new ModParFinder_(delegate(String key, Int32 current)
        {
            current++;
 
            if (!cmdArgs.Modifiers.ContainsKey(key))
                cmdArgs.Modifiers.Add(key, new List<String>());
 
            while (current < args.Length && !args[current].StartsWith(modIndicator.ToString()))
            {
                cmdArgs.Modifiers[key].Add(args[current]);
                current++;
            }
        });
 
    Boolean modsFound = false;
    if (args != null)
        for (Int32 i = 0; i < args.Length; i++)
        {
            if (args[i].StartsWith(modIndicator.ToString()))
            {
                ModParFinder.Invoke(args[i], i);
                modsFound = true;
            }
            else if (!modsFound)
                cmdArgs.Parameters.Add(args[i]);
        }
 
    return cmdArgs;
}

Para usar y consultar esta funcionalidad, un sencillo ejemplo:

static Int32 Main(String[] args)
{
    Console.WriteLine(Environment.CommandLine);
 
    CommandLineArguments cmdL = ParseParameters(args, '-');
 
    // Mostrar la información recabada
 
    Console.WriteLine("Parameters: ");
    foreach (String s in cmdL.Parameters)
    {
        Console.WriteLine("  " + s);
    }
 
    Console.WriteLine("Modifiers: ");
    foreach (String k in cmdL.Modifiers.Keys)
    {
        Console.WriteLine(k+": ");
        foreach (String s in cmdL.Modifiers[k])
            Console.WriteLine("  " + s);
    }
 
    Console.ReadKey(true);
    return 0;
}

Por ejemplo, si ejecutamos la aplicación y le pasamos los siguientes argumentos:

MiApp.exe "C:\Archivos de programa\path largo" -s smod -l "lmod largo" 123 -w wmod1 wmod2 -h -j

El resultado será el siguiente:

Parameters:
C:\Archivos de programa\path largo
Modifiers:
-s:
smod
-l:
lmod largo
123
-w:
wmod1
wmod2
-h:
-j:

Luego el validar la cantidad y corrección de los parámetros y modificadores... a gusto de cada uno :D

Actualmente calificado 5.0 por 1 persona(s)

  • Currently 5/5 Stars.
  • 1
  • 2
  • 3
  • 4
  • 5

Tags: ,

C# 3.0 | .NET 3.5

Related posts

Comentarios

marzo 17. 2008 14:05

trackback

Trackback from Pensando en asíncrono

Parsear los argumentos de la linea de comando

Pensando en asíncrono

marzo 17. 2008 14:05

trackback

Trackback from vtortola

Parsear los argumentos de la linea de comando

vtortola

mayo 16. 2008 19:37

pingback

Pingback from crisfervil.wordpress.com

Arguments Handler « TeraBIThia

crisfervil.wordpress.com

Comments are closed

Powered by BlogEngine.NET 1.1.1.8
This theme is a variation of Mads Kristensen by Valeriano Tórtola

Valeriano Tórtola

Personal Ver perfil
E-mail Enviar correo
LinkedIn LinkedIn
Fotos Fotos
MCPD

Publicidad

Posts recientes

Disclaimer

Las opiniones mostradas aqui son mis opniones y no representan el punto de vista de mi empresa en ninguna forma.

Creative Commons License

Esta obra está bajo una licencia de Creative Commons

Locations of visitors to this page

© Copyright 2008

Sign in

Calendario

<<  octubre 2008  >>
lumamijuvido
293012345
6789101112
13141516171819
20212223242526
272829303112
3456789

Ver en calendario extendido