2010-09-17 15 views
10

Per passare un percorso con spazi a un'applicazione di console .NET, è necessario scappare. Probabilmente non sfugge, ma circondano con virgolette doppie:Come uscire dal percorso contenente spazi

myapp.exe --path C:\Program Files\MyApp` 

diventa

new string[] { "--path", "C:\Program", "Files\MyApp" } 

ma

myapp.exe --path "C:\Program Files\MyApp" 

diventa

new string[] { "--path", "C:\Program Files\MyApp" } 

e funziona benissimo e si può analizzare così facilmente .

voglio estendere il set di parametri dati con un'aggiunta e creare un nuovo processo con il set risultante di parametri:

new ProcessStartInfo(
    Assembly.GetEntryAssembly().Location, 
    String.Join(" ", Enumerable.Concat(args, new[] { "--flag" }))) 

questo diventa myapp.exe --path C:\Program Files\MyApp --flag dove percorso scende la sua fuga.

Come risolverlo con una soluzione comune? (senza cercare il valore di ogni parametro che richiede l'escaping e quotandolo manualmente)

risposta

5

Non penso sia possibile poiché lo spazio è il delimitatore per gli argomenti CLI, quindi è necessario eseguire l'escape.

È possibile estrarre questo in un metodo di estensione abbastanza bene in modo da poter eseguire solo args.Escape() nel codice qui sopra.

public static string[] Escape(this string[] args) 
{ 
    return args.Select(s => s.Contains(" ") ? string.Format("\"{0}\"", s) : s).ToArray(); 
} 
+0

Grande! Grazie! btw, penso che non ci sia bisogno di 'string []' e 'IEnumerable ' suite qui bene – abatishchev

4

Basta citare ogni parametro. Questo ...

myapp.exe "--path" "C:\Program Files\MyApp" "--flag" 

... è una riga di comando perfettamente valida e fa esattamente ciò che si desidera.

+0

i.e. Select (s => String.Format ("\" {0} \ "", s)) '. Sembra fantastico ma la soluzione di @ amarsuperstar mi piace un po 'di più :) Grazie, Heinzi – abatishchev

+0

non funziona in un caso in cui il percorso ha una "\" finale come "C: \ Programmi \ MyApp \" – EdmundYeung99

+1

@ EdmundYeung99: Sì, è un problema davvero difficile. La seguente domanda contiene alcuni tentativi per aggirare il problema: http://stackoverflow.com/q/5510343/87698 – Heinzi

Problemi correlati