Pregunta

Tengo una aplicación de consola .NET bastante simple.Deseo pasar algunos argumentos de la línea de comando...nada difícil ahí.

Ahora, el truco es que normalmente tengo una LISTA de elementos que deseo pasar, para un argumento.En este caso, una lista de archivos.No estoy seguro de cuál es la mejor manera de hacer esto.

eg. myapp.exe files=aaa.txt,bbb.txt,ccc.txt 

pero ¿qué pasa con los nombres de archivos con espacios?¿Debería delimitarlo con comas?

Para hacer las cosas interesantes, tengo otros argumentos que aceptan valores únicos.así que no estoy seguro de si debo poner todos los datos del argumento entre comillas dobles.

eg. myapp.exe files=aaa.txt,bbb.txt formatting=true foo=hello

o

eg myapp.exe files="aaa.txt","bbb.txt" formatting="true" foo="hello"
¿Fue útil?

Solución

Probablemente sea un poco tarde para el programa en el que estás trabajando, pero así es como puedes hacerlo usando Opciones mono

static void Main(string[] args)
{
    //let's try this mono.options thing shall we?
    string xapfile = null;
    var files = new List<string>();
    var p = new Mono.Options.OptionSet()
    {
        { "xap=", v => xapfile =v },
        { "file:", v => files.Add(v)}
    };
    List<string> extra = p.Parse(args);


    Console.WriteLine(@"
    xap = '{0}', 
    file(s)= {1}", 
         xapfile, 
         string.Join(",", files.ToArray())
    );
    Console.WriteLine(@"
    left overs: {0}", 
        string.Join(Environment.NewLine, extra.ToArray())
    );
    // rest of your Main here

La sintaxis de llamada sería

myapp.exe --file="file 1" --file="file 2" --file="file 3"

Incluso podrías renunciar a toda la variable de archivos y simplemente tratar los sobrantes como archivos y llamarlos como myapp.exe "file 1" "file 2" "file 3" y saque los archivos de la lista adicional.

Mono.Options es bastante poderoso.Ni siquiera tienes que usar --, parece que puedes usar /file= o -file=

Desafortunadamente, Windows no realiza tareas globales por usted (a menos que esté pasando las opciones a un cmdlet de PowerShell), por lo que debe hacerlo usted mismo.Aunque es bastante fácil aquí está un poco de código que he usado en el pasado para expandir *.foo o "c:\temp\*.bar|c:\temp\*.txt"

Además, a menos que incluya los nombres de los archivos en películas sonoras, probablemente no separaría la lista con comas, ya que la coma es válida en un nombre de archivo.Sabes que uno te va a morder algún día :-) Pipe es una buena elección, pero sólo si envuelves toda la expresión en cine sonoro; de lo contrario, Windows cree que estás haciendo pipe.Ah, los placeres del procesamiento de la línea de comandos :-)

Otros consejos

Cada argumento, si contiene espacios debe escribirse entre comillas. De lo contrario dejaría cotizaciones fuera de él.

Dado que el shell probablemente soporta comodín globbing es mejor permitir los archivos de entrada para ser una lista separada por espacios simple y asumir que si un nombre de archivo contiene espacios que se han escapado ya sea por los alrededores con citas o por medio de \ caracteres. Por llanura quiero decir no contienen -F o estilo / f interruptores.

Una técnica ligeramente menos común, pero ni el apoyo de todas las bibliotecas que realizan análisis de línea de comandos, es permitir que múltiples entradas de la forma -f foo.txt -f bar.txt. Esto no juega bien con la línea de comandos globbing (a diferencia de la solución anterior).

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top