Tengo una aplicación de línea de comandos C# que necesito ejecutar en Windows y en mono en Unix. En algún momento quiero iniciar un subproceso dado un conjunto de parámetros arbitrarios pasados a través de la línea de comando. Por ejemplo:¿Cómo inicio un subproceso en C# con un argv? (O convierte agrv a una cadena de argumentos legal)
Usage: mycommandline [-args] -- [arbitrary program]
Desafortunadamente, System.Diagnostics.ProcessStartInfo sólo toma una cadena de argumentos. Este es un problema para los comandos como:
./my_commandline myarg1 myarg2 -- grep "a b c" foo.txt
En este caso argv parece:
argv = {"my_commandline", "myarg1", "myarg2", "--", "grep", "a b c", "foo.txt"}
Tenga en cuenta que las comillas en "abc" son despojados por el shell por lo que si simplemente concatenar los argumentos para crear la cadena arg para ProcessStartInfo obtengo:
args = "my_commandline myarg1 myarg2 -- grep a b c foo.txt"
Que no es lo que quiero.
¿Hay una manera simple de pasar un argv al lanzamiento del subproceso en C# O para convertir un argv arbitrario en una cadena que es legal para Windows y linux shell?
Cualquier ayuda sería muy apreciada.
Solo una nota: C# en Windows no tiene este problema porque Windows técnicamente no tiene un argv. Toda la línea de comando se pasa al proceso, y la división de los argumentos es el trabajo del nuevo proceso, no del sistema operativo.Unix adopta el enfoque opuesto: el sistema operativo es responsable de pasar una serie de cadenas, por lo que el proceso de llamada puede manejar cosas como la expansión de comodines. –
@DanielPryden eso no es verdad. Los programas de Windows tienen una lista de argv como POSIX. .Net simplemente oculta esta lista. Bastante irritante si me preguntas. – IanNorton
@IanNorton: Por el contrario, 'CreateProcess' solo toma una sola cadena de argumento. Microsoft C Runtime (MSVCRT) analiza esa cadena y la hace disponible como argv, pero no es necesario que los programas utilicen la implementación CRT, y el análisis que hace la CRT no garantiza que devuelva el mismo conjunto de tokens que se utilizaron para iniciarse. el proceso. –