Domanda

ho un piuttosto semplice applicazione console .NET. Vorrei passare in alcuni argomenti della riga di comando ... niente dura lì.

Ora, il calciatore è, di solito ho un elenco di elementi che desidero passare, per un argomento. In questo caso, un elenco di file. Non sono sicuro del modo migliore per farlo.

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

ma per quanto riguarda i nomi di file con spazi? Dovrei virgola delimate vero?

per rendere le cose interessanti, ho altri argomenti, che accettano i valori singoli .. quindi non sono sicuro se devo mettere tutti i dati ARG tra virgolette ..

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"
È stato utile?

Soluzione

Probabilmente un po 'tardi per il programma che si sta lavorando, ma ecco come si potrebbe fare utilizzando 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

La chiamata sintassi sarebbe

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

Si potrebbe anche rinunciare file variabili del tutto e solo trattare gli avanzi dei file, e chiamarlo come myapp.exe "file 1" "file 2" "file 3" e cogliere i file fuori dalla lista in più.

Mono.Options è abbastanza potente. Non hanno nemmeno bisogno di usare -, sembra si può usare /file= o -file=

Purtroppo, Windows non fare globbing per voi (a meno che non si sta passando le opzioni per un cmdlet PowerShell), in modo da avere a farlo da soli. E 'abbastanza facile, però, ecco un po' di codice ho usato in passato per espandere *.foo o "c:\temp\*.bar|c:\temp\*.txt"

Inoltre, a meno che non si avvolgono i nomi dei file in talkie, probabilmente non virgole separano la lista, come virgola è valido in un nome di file. Voi sapete che si va a mordere voi un giorno :-) tubo rende una buona scelta, ma solo se si avvolgono l'intera espressione in talkie, altrimenti finestre pensa che tu stai facendo tubazioni. Ah, le gioie di trasformazione linea di comando: -)

Altri suggerimenti

Ogni argomento, se contiene spazi deve essere racchiuso tra virgolette. In caso contrario, vorrei lasciare citazioni fuori di esso.

Dato che la shell probabilmente supporta wild card globbing è meglio per consentire i file di input per essere un semplice elenco separato da spazio e di assumere che se un nome del file contiene spazi che esso sarà stato sfuggito già sia con circostante con le citazioni o tramite \ caratteri. In aereo intendo non contengono -F o / stile f switch.

Una tecnica un po 'meno comune, ma non supportata da tutte le biblioteche che fanno linea di analisi di comando, è quello di consentire a più voci del modulo -f foo.txt -f bar.txt. Questo non gioca bene con la linea di comando globbing (a differenza della soluzione di cui sopra).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top