2012-12-10 17 views
14

Domanda: Dato un nome di file e un elenco arbitrario di stringhe, c'è un modo canonico per creare una singola riga di comando in modo tale che Environment.GetCommandLineArgs (e C# 's void main(String[] args)/VB Sub Main(args() As String)) restituirà la stessa lista di stringhe?soluzione canonica per sfuggire argomenti della riga di comando NET


Background: Il modo NET divide una linea di comando in argomenti è surprisingly complex, ad esempio:

Se una doppia virgoletta segue due o un numero di barre rovesciate, ciascuna coppia backslash procedere viene sostituito con una barra rovesciata e viene rimossa la virgoletta doppia. Se una virgoletta doppia segue un numero dispari di backslash, incluso uno solo, ogni coppia precedente viene sostituita con una barra rovesciata e la barra rovesciata rimanente viene rimossa; tuttavia, in questo caso le virgolette doppie non vengono rimosse.

Molti provano l'approccio semplice "metti ogni argomento tra virgolette doppie e doppie" e falliscono non appena uno degli argomenti contiene una barra rovesciata finale. Ci sono state varie domande su StackOverflow per quanto riguarda questo problema, come ad esempio:

Tuttavia, le loro risposte non sono né abbastanza generali da fornire una soluzione canonica per tutti i casi o sembra essere sviluppata "iterativamente" ("Oh, c'è un altro caso speciale che ho dimenticato, diamo d it e ora dovrebbe coprire la maggior parte dei casi ... "). Dal momento che questo è piuttosto un problema comune, mi piacerebbe vedere una soluzione che prevede la fiducia, per esempio, da una

  • proveniente da una fonte autorevole (forse un blog da uno degli sviluppatori coinvolti in questa pazza convenzione della riga di comando) o
  • fornendo una prova formale che l'algoritmo fornito soddisfa i requisiti della riga di comando .NET.
+0

Perseguire una soluzione generica a questo problema è molto improduttivo. Scrivi i dati su un file, passa invece il percorso del file. –

+0

Sono d'accordo con Hans. Cosa faresti con la soluzione una volta che l'hai avuto? – neontapir

+3

@HansPassant: non si ha sempre il controllo sull'applicazione * * * (e molte applicazioni là fuori oggi * fanno * usano più argomenti da riga di comando). Pertanto, lo scrittore dell'applicazione * calling * potrebbe voler assicurarsi che gli argomenti siano codificati correttamente (idealmente, senza dover reinventare la ruota e studiare la riga di comando di Windows/.NET sfuggendo ogni volta alla sintassi in dettaglio). – Heinzi

risposta

1

Alcuni anni fa, Microsoft ha annunciato che stavano per rilasciare un parser riga di comando su CodePlex (al posto del System.Shell.CommandLine che avrebbe dovuto spedire con .NET Framework 4). Non sono sicuro che lo facessero davvero. Se si desidera un parser sviluppato da un dipendente Microsoft, dare un'occhiata a cmdline. Inoltre è possibile cercare l'analisi della riga di comando in CodePlex.

Si potrebbe anche provare Mono.Options che è abbastanza potente.

+1

+1 Mono.Options ha funzionato bene anche per me. – kenny

+3

La domanda riguarda la creazione di una riga di comando, non l'analisi di uno - -1. –

+0

@AntonTykhyy Hai ragione. Ho frainteso la domanda. –

2

This algorithm è generico e proviene da una fonte relativamente autorevole (blog MSDN).

+0

Grazie, sembra utile. Tuttavia, solleva la questione se [CommandLineToArgvW] (http://msdn.microsoft.com/en-us/library/bb776391%28v=vs.85%29.aspx) e [Environment.GetCommandLineArgs] (http: // msdn.microsoft.com/en-us/library/system.environment.getcommandlineargs.aspx) si comportano allo stesso modo. Alcune fonti sostengono di farlo, ma la documentazione sembra differire nel caso di "un numero pari di backslash più una virgoletta". – Heinzi

+0

Dai un'occhiata a [documentazione per versioni precedenti di .NET] (http://msdn.microsoft.com/en-us/library/system.environment.getcommandlineargs%28v=vs.80%29.aspx). Versioni diverse documentano un comportamento diverso. È un disastro :) –

Problemi correlati