una son secuencias secuencia saldo rutas representa nueva línea los juego escape ejemplos cuales comandos caracteres c# command-line escaping

son - C#Análisis de línea de comando de rutas citadas y evitar caracteres de escape



secuencias de escape en c pdf (3)

¿Cómo es posible analizar los argumentos de la línea de comandos que deben interpretarse como rutas? args [] contiene cadenas que se unen automáticamente si están entre comillas, por ejemplo:

example.exe uno dos "tres cuatro"

args[0] = one args[1] = two args[2] = three four

Sin embargo, args [] no analizará la propiedad "C: / Ejemplo /" como argumento. Más bien, proporcionará el argumento como "C: / Ejemplo" (con la cita adicional incluida). Esto se debe a que la barra diagonal inversa en la ruta se trata como un carácter de escape y, por lo tanto, la cita final que el usuario proporcionó en el comando -Línea se convierte en parte del argumento.

.p.ej:

example.exe uno "C: / InputFolder" "C: / OutuptFolder /"

args[0] = one args[1] = C:/InputFolder" args[2] = C:/OutputFolder"

Un kludge fácil podría ser:

_path = args[i].Replace("/"", @"/");

Sin embargo, estoy seguro de que hay una mejor práctica para esto. ¿Cómo se podría analizar correctamente una línea de comando que incluye rutas, evitando que la matriz args [] se rellene incorrectamente con las picaduras que se han analizado para los caracteres de escape?

NOTA: ¡No me gustaría incluir una biblioteca completa de análisis de línea de comandos en mi proyecto! Solo necesito manejar las rutas citadas y deseo hacerlo de forma "manual". Por favor, no recomiende NConsoler, Mono, o cualquier otra biblioteca de análisis de línea de comandos grande del "fregadero de la cocina".

TAMBIÉN NOTA: por lo que puedo decir, esta no es una pregunta duplicada. Mientras que otras preguntas se centran en el análisis genérico de la línea de comando, esta pregunta es específica del problema que las rutas introducen cuando partes de ellas se interpretan como secuencias de escape.


Me gusta tu idea:

_path = args[i].Replace("/"", @"/");

Está limpio y no tendrá ningún efecto a menos que exista el problema.


No es una respuesta, pero aquí hay algunos antecedentes y explicaciones de Jeffrey Tan, Microsoft Online Community Support (12/7/2006):

Nota: esto no es una derrota de código sino por diseño, ya que los backslashe se usan normalmente para escapar de ciertos caracteres especiales. Además, este algoritmo es el mismo que los argumentos de línea de comando de Win32 que analizan la función CommandLineToArgvW. Consulte la sección de Comentarios a continuación: http://msdn2.microsoft.com/en-us/library/bb776391.aspx

También hace referencia al método FX Environment.GetCommandLineArgs para obtener una explicación más detallada del comportamiento de manejo de barra.

Personalmente creo que esto es un lastre, y me sorprende que no me haya mordido antes. O tal vez lo tengo y no lo sé? Sin embargo, el reemplazo ciego de las comillas con barras diagonales no me parece una solución. Estoy votando la pregunta, porque fue una revelación.


Tuve la misma frustración. Mi solución fue usar expresiones regulares. Mi entrada esperada es una lista de rutas, algunas de las cuales pueden ser citadas. El kludge anterior no funciona a menos que se citan todos los últimos argumentos.

// Capture quoted string or non-quoted strings followed by whitespace string exp = @"^(?:""([^""]*)""/s*|([^""/s]+)/s*)+"; Match m = Regex.Match(Environment.CommandLine, exp); // Expect three Groups // group[0] = entire match // group[1] = matches from left capturing group // group[2] = matches from right capturing group if (m.Groups.Count < 3) throw new ArgumentException("A minimum of 2 arguments are required for this program"); // Sort the captures by their original postion var captures = m.Groups[1].Captures.Cast<Capture>().Concat( m.Groups[2].Captures.Cast<Capture>()). OrderBy(x => x.Index). ToArray(); // captures[0] is the executable file if (captures.Length < 3) throw new ArgumentException("A minimum of 2 arguments are required for this program");

¿Alguien puede ver un regex más eficiente?