2010-09-17 30 views
10

Para pasar una ruta con espacios a la aplicación de consola .NET debe escapar de ella. Probablemente no escapa pero envolvente con comillas dobles:Cómo escapar de la ruta que contiene espacios

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

se convierte en

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

pero

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

convierte

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

y trabaja muy bien y se puede analizar tan fácilmente .

quiero extender el conjunto de parámetros dados con una adición de un e iniciar un nuevo proceso con el resultado conjunto de parámetros:

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

esto se convierte en myapp.exe --path C:\Program Files\MyApp --flag donde ruta deja caer su escape.

¿Cómo solucionarlo con una solución común? (sin buscar el valor de cada parámetro que requiera escapar y citarlo manualmente)

Respuesta

5

No creo que sea posible ya que el espacio es el delimitador de los argumentos CLI, por lo que necesitarían ser escapados.

Puede extraer esto en un método de extensión bastante bien para que pueda ejecutar args.Escape() en su código anterior.

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

¡Genial! ¡Gracias! por cierto, creo que no hay necesidad de 'string []' y 'IEnumerable ' suites aquí bien – abatishchev

4

Simplemente cite todos los parámetros. Esto ...

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

... es una línea de comando perfectamente válida y hace exactamente lo que usted desea.

+0

es decir 'Seleccione (s => String.Format (" \ "{0} \" ", s))'. Se ve muy bien, pero la solución de @ amarsuperstar me gusta un poco más :) Gracias, Heinzi – abatishchev

+0

no funciona en un caso donde la ruta tiene una "\" como "C: \ Program Files \ MyApp \" – EdmundYeung99

+1

@ EdmundYeung99: Sí, eso es un problema realmente complicado. La siguiente pregunta contiene algunos intentos para evitar el problema: http://stackoverflow.com/q/5510343/87698 – Heinzi

Cuestiones relacionadas