2012-03-16 18 views
13

Estoy tratando de leer los argumentos del usuario en una aplicación C#. Yo sé cómo leerlos con base en la posiciónleer el interruptor de línea de comando

string[] args = Environment.GetCommandLineArgs(); 

pero me gustaría leerlos desde los interruptores como

app.exe /f /d:foo 

estoy realmente luchando para encontrar cualquier información sobre cómo hacer esto .. .

+0

Desafortunadamente, C# no le da mucha más información que simplemente una lista de argumentos de línea de comandos como cadenas. Ni siquiera incluye el nombre .exe. –

+0

Parece un buen lugar para comenzar: [http://msdn.microsoft.com/en-us/library/acy3edy3(v=vs.80).aspx](http://msdn.microsoft.com/en -us/library/acy3edy3% 28v = vs.80% 29.aspx) –

Respuesta

21

¿Por qué no acaba de analizar el conjunto de argumentos pasados ​​y actuar en base a ellas, como este

foreach (string arg in args) 
{ 
    switch (arg.Substring(0, 2).ToUpper()) 
    { 
     case "/F": 
      // process argument... 
      break; 
     case "/Z": 
      // process arg... 
      break; 
     case "/D": 
      paramD = arg.Substring(3); 
      break; 
     default: 
      // do other stuff... 
      break; 
    } 
} 
4
void Main(string[] args) 
{ 
    foreach(var arg in args) 
    { 
     // process each arg if needed, i.e., 
     // remove '-', '/', uppercase, whatever 
     switch(arg) 
     { 
      case "blah": 
      // ... 
     } 
    } 
} 

Bibliotecas existen para este fin, que hacen todo el proceso mucho más fácil, pero si se trata de una aplicación de uno fuera de él pueden no valer la pena. Depende de cuán complejos sean los argumentos de su línea de comando.

+2

@MTeck - [Mono.Options] (https://github.com/mono/mono/blob/master/mcs/class/Mono.Options /Mono.Options/Options.cs) es un gran ejemplo liviano de dicha biblioteca. –

0

Bueno, básicamente ya has terminado. Procesa la matriz string[] que obtienes del marco y listo. No hay una forma incorporada de lograr lo que está pidiendo.

Como solución tercera partes puede tener una mirada en

C#/.NET Command Line Arguments Parser

0

yo soy el autor de una biblioteca de línea de comandos NET fuente abierta que puede satisfacer sus necesidades: C# CLI.

Quizás desee leer this pregunta para otras sugerencias.

0

Creo que tendrá que implementar su propia implementación. Después de escribir pruebas unitarias para evaluar el nuevo método, que podría empezar a pensar en la línea de ...

foreach (string arg in args) 
{ 
    flagF = flagF || arg == "/f"; // assuming F is boolean 
    flagD = flagD ?? (arg.Substring(0,3) =="/d:" ? arg.Substring(3) : null); 
} 
+0

flagF se debe inicializar en falso, luego hacer 'flagF | = arg =="/f ";' de modo que una vez que se convierte en verdadero, permanece verdadero. De la manera que lo tienes ahora, flagF siempre es verdad. –

+0

luego para flagD, en su '()' cambie el 2 al 3 como '"/d: "' tiene 3 caracteres. –

+0

@ChuckSavage gracias; el código atrapó la idea de todos modos, incluso si se escribía apresuradamente :-). Corrigiendo ahora. – sfuqua

2

¿Qué pasa,

// first is exe of executing program 
string[] args = Environment.CommandLine.Split('/').Skip(1).ToArray(); 
foreach (string arg in args) 
{ 
    string value = arg.Trim(); 
    switch (value) 
    { 
     case "f": 
      //... 
      continue; 
    } 
    if (value.StartsWith("d:")) 
    { 
     value = value.Substring(2); 
     // ... 
     continue; 
    } 
} 
3

he visto un par de respuestas que recorrer la colección args string - el problema es que necesita el siguiente artículo después de que se pulsa el interruptor que busca . Usé el índice de matriz de la colección para obtener el siguiente artículo.

En mi ejemplo estoy buscando un servidor y un puerto/S y/P. Espero que esto ayude a alguien:

 var server = string.Empty; 
     var port = string.Empty; 

     for(var x = 0; x < args.Count(); x++) 
     { 
      switch (args[x].Trim().ToUpper()) 
      { 
       case "/S": 
        server = args[x + 1]; 
        break; 
       case "/P": 
        port = args[x + 1]; 
        break;           
      } 
     } 
+0

Es probable que desee avanzar x después de establecer el valor en el siguiente argumento.De lo contrario, procesará innecesariamente arg: server = args [++ x]; –

Cuestiones relacionadas