Question

J'ai une application console .NET assez simple. Je voudrais passer quelques arguments de ligne de commande ... rien là difficile.

Maintenant, le kicker est, j'ai généralement une liste des articles que je veux passer, par un argument. Dans ce cas, une liste de fichiers. Je ne suis pas sûr de la meilleure façon de le faire.

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

mais ce que sur les noms de fichiers avec des espaces? Au cas où je virgule delimate il?

pour rendre les choses intéressantes, j'ai d'autres args, qui acceptent des valeurs uniques .. donc je ne sais pas si je dois mettre toutes les données arg guillemets ..

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

ou

eg myapp.exe files="aaa.txt","bbb.txt" formatting="true" foo="hello"
Était-ce utile?

La solution

Probablement un peu en retard pour le programme que vous travaillez, mais voici comment vous pouvez le faire en utilisant Mono.Options

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

syntaxe d'appel serait

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

Vous pouvez même renoncer à l'ensemble des fichiers variables et simplement traiter les restes comme les fichiers, et l'appeler comme les plumer et myapp.exe "file 1" "file 2" "file 3" fichiers de la liste supplémentaire.

Mono.Options est assez puissant. Vous ne devez même pas utiliser -, il semble que vous pouvez utiliser ou /file= -file=

Malheureusement, Windows ne le fait pas englobement pour vous (sauf si vous passez les options à une applet de commande PowerShell), donc vous devez le faire vous-même. Il est assez facile cependant, est un peu de code Je l'ai utilisé dans le passé pour développer ou *.foo "c:\temp\*.bar|c:\temp\*.txt"

En outre, à moins que vous envelopper les noms de fichiers dans walkies, je ne serais probablement pas une virgule sépare la liste, comme une virgule est valide dans un nom de fichier. Vous savez que l'on va vous mordre un jour :-) pipe fait un bon choix, mais seulement si vous envelopper toute expression dans walkies, sinon les fenêtres PENSE que vous faites la tuyauterie. Ah, les plaisirs de traitement de ligne de commande: -)

Autres conseils

Chaque argument, si elle contient des espaces doit être entre guillemets. Sinon, je partirais citations hors de lui.

Étant donné que votre shell supporte probablement wild card englobement il est préférable de permettre les fichiers d'entrée à une liste séparée de l'espace ordinaire et de supposer que si un nom de fichier contient des espaces qu'il aura été échappé déjà soit en entourant avec des guillemets ou via \ caractères. En clair je veux dire ne contiennent pas de commutateurs de style -F ou / f.

Une technique un peu moins commune, mais ni pris en charge par toutes les bibliothèques qui font l'analyse de ligne de commande, est de permettre à plusieurs entrées de la forme -f foo.txt -f bar.txt. Cela ne joue pas bien avec la ligne de commande englobement (contrairement à la solution ci-dessus).

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top