¿Cómo ejecuto un programa de línea de comandos desde C # y obtengo los resultados STD OUT? Específicamente, quiero ejecutar DIFF en dos archivos que se seleccionan mediante programación y escribir los resultados en un cuadro de texto.
c#
command-line
Ala
fuente
fuente
Respuestas:
El código es de MSDN .
fuente
{YourProcessObject}.StartInfo.Arguments
cadena.p.StandardError
secuencia. Cuando la secuencia se llena, parece que el proceso se detendrá hasta que se consuman los datos, por lo que tengo que leer ambosStandardError
yStandardOutput
para garantizar que una tarea se ejecute correctamente.Aquí hay una muestra rápida:
fuente
Hay otro parámetro que encontré útil, que utilizo para eliminar la ventana del proceso
esto ayuda a ocultar la ventana de la consola negra del usuario por completo, si eso es lo que desea.
fuente
fuente
process.StartInfo.RedirectStandardError = true;
yif (process.ExitCode == 0)
qué respuesta aceptada no tiene.La respuesta aceptada en esta página tiene una debilidad que es problemática en situaciones raras. Hay dos identificadores de archivo en los que los programas escriben por convención, stdout y stderr. Si acaba de leer un identificador de archivo único, como la respuesta de Ray, y el programa que está iniciando escribe suficiente salida para stderr, llenará el búfer y bloque stderr de salida. Entonces sus dos procesos están estancados. El tamaño del búfer puede ser 4K. Esto es extremadamente raro en los programas de corta duración, pero si tiene un programa de larga ejecución que genera repetidamente salidas en stderr, sucederá eventualmente. Esto es difícil de depurar y rastrear.
Hay un par de buenas maneras de lidiar con esto.
Una forma es ejecutar cmd.exe en lugar de su programa y usar el argumento / c para cmd.exe para invocar su programa junto con el argumento "2> & 1" a cmd.exe para indicarle que combine stdout y stderr.
Otra forma es usar un modelo de programación que lea ambas manijas al mismo tiempo.
fuente
fuente
Necesitará usar
ProcessStartInfo
conRedirectStandardOutput
habilitado; luego puede leer la secuencia de salida. Puede que le resulte más fácil usar ">" para redirigir la salida a un archivo (a través del sistema operativo) y luego simplemente leer el archivo.[editar: como lo que hizo Ray: +1]
fuente
RedirectStandardOutput
realidad.Si no le importa introducir una dependencia, CliWrap puede simplificar esto para usted:
fuente
Puede que esta no sea la mejor / más fácil forma, pero puede ser una opción:
Cuando ejecute desde su código, agregue "> output.txt" y luego lea en el archivo output.txt.
fuente
Puede iniciar cualquier programa de línea de comandos utilizando la clase Process y establecer la propiedad StandardOutput de la instancia de Process con un lector de flujo que cree (ya sea basado en una cadena o en una ubicación de memoria). Una vez que se completa el proceso, puede hacer cualquier diferencia que necesite en esa secuencia.
fuente
Esto podría ser útil para alguien si intenta consultar el caché ARP local en una PC / Servidor.
fuente
Comando de ejecución de una línea:
Lea la salida del comando en la menor cantidad de código reable:
fuente
Hay una clase ProcessHelper en el código fuente de PublicDomain que puede interesarle.
fuente
En caso de que también necesite ejecutar algún comando en cmd.exe, puede hacer lo siguiente:
Esto devuelve solo la salida del comando en sí:
También puede usar en
StandardInput
lugar deStartInfo.Arguments
:El resultado se ve así:
fuente
Solo por diversión, aquí está mi solución completa para obtener la salida PYTHON, con un clic de botón, con informes de errores. Simplemente agregue un botón llamado "butPython" y una etiqueta llamada "llHello" ...
fuente
Dado que la mayoría de las respuestas aquí no implementan el
using
statemant paraIDisposable
y otras cosas que creo que podrían ser nessecary, agregaré esta respuesta.Para C # 8.0
fuente