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:
- How to escape path containing spaces
- Escape command line arguments in c#
- Escape string for Process.Start
- Passing command-line arguments in C#
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.
Perseguire una soluzione generica a questo problema è molto improduttivo. Scrivi i dati su un file, passa invece il percorso del file. –
Sono d'accordo con Hans. Cosa faresti con la soluzione una volta che l'hai avuto? – neontapir
@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