Ejecutar comandos del símbolo del sistema

¿Hay alguna forma de ejecutar los comandos del símbolo del sistema desde una aplicación C #? Si es así, ¿cómo haré lo siguiente?

copy /b Image1.jpg + Archive.rar Image2.jpg 

Esto básicamente integra un archivo RAR dentro de la imagen JPG. Me preguntaba si había una manera de hacer esto automáticamente en C #.

esto es todo lo que tiene que hacer ejecutar comandos de shell desde C #

 string strCmdText; strCmdText= "/C copy /b Image1.jpg + Archive.rar Image2.jpg"; System.Diagnostics.Process.Start("CMD.exe",strCmdText); 

EDITAR:

Esto es para ocultar la ventana de cmd.

 System.Diagnostics.Process process = new System.Diagnostics.Process(); System.Diagnostics.ProcessStartInfo startInfo = new System.Diagnostics.ProcessStartInfo(); startInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; startInfo.FileName = "cmd.exe"; startInfo.Arguments = "/C copy /b Image1.jpg + Archive.rar Image2.jpg"; process.StartInfo = startInfo; process.Start(); 

EDITAR: 2

Importante es que el argumento comience con /C contrario no funcionará. Cómo dijo Scott Ferguson : “Realiza el comando especificado por la cadena y luego finaliza”.

Intenté la solución @RameshVel pero no pude pasar argumentos en mi aplicación de consola. Si alguien experimenta el mismo problema aquí hay una solución:

 using System.Diagnostics; Process cmd = new Process(); cmd.StartInfo.FileName = "cmd.exe"; cmd.StartInfo.RedirectStandardInput = true; cmd.StartInfo.RedirectStandardOutput = true; cmd.StartInfo.CreateNoWindow = true; cmd.StartInfo.UseShellExecute = false; cmd.Start(); cmd.StandardInput.WriteLine("echo Oscar"); cmd.StandardInput.Flush(); cmd.StandardInput.Close(); cmd.WaitForExit(); Console.WriteLine(cmd.StandardOutput.ReadToEnd()); 
 var proc1 = new ProcessStartInfo(); string anyCommand; proc1.UseShellExecute = true; proc1.WorkingDirectory = @"C:\Windows\System32"; proc1.FileName = @"C:\Windows\System32\cmd.exe"; proc1.Verb = "runas"; proc1.Arguments = "/c "+anyCommand; proc1.WindowStyle = ProcessWindowStyle.Hidden; Process.Start(proc1); 

Aunque técnicamente esto no responde directamente a la pregunta planteada, responde la pregunta de cómo hacer lo que el póster original quería hacer: combinar archivos. En todo caso, esta es una publicación para ayudar a los novatos a comprender de lo que están hablando Instance Hunter y Konstantin.

Este es el método que uso para combinar archivos (en este caso, un jpg y un zip). Tenga en cuenta que creo un búfer que se llena con el contenido del archivo zip (en fragmentos pequeños en lugar de en una gran operación de lectura), y luego el búfer se escribe en la parte posterior del archivo jpg hasta que finaliza el archivo zip alcanzado:

 private void CombineFiles(string jpgFileName, string zipFileName) { using (Stream original = new FileStream(jpgFileName, FileMode.Append)) { using (Stream extra = new FileStream(zipFileName, FileMode.Open, FileAccess.Read)) { var buffer = new byte[32 * 1024]; int blockSize; while ((blockSize = extra.Read(buffer, 0, buffer.Length)) > 0) { original.Write(buffer, 0, blockSize); } } } } 

Sí, lo hay (ver el enlace en el comentario de Matt Hamilton), pero sería más fácil y mejor usar las clases IO de .NET. Puede usar File.ReadAllBytes para leer los archivos y luego File.WriteAllBytes para escribir la versión “incrustada”.

Ninguna de las respuestas anteriores ayudó por alguna razón, parece que eliminan los errores debajo de la alfombra y dificultan la resolución de problemas. Así que terminé yendo con algo como esto, tal vez ayudará a alguien más:

 var proc = new Process { StartInfo = new ProcessStartInfo { FileName = @"C:\Program Files\Microsoft Visual Studio 14.0\Common7\IDE\tf.exe", Arguments = "checkout AndroidManifest.xml", UseShellExecute = false, RedirectStandardOutput = true, CreateNoWindow = true, WorkingDirectory = @"C:\MyAndroidApp\" } }; proc.Start(); 

Aquí hay una versión de código simple y menos simple. También ocultará la ventana de la consola-

 System.Diagnostics.Process process = new System.Diagnostics.Process(); process.StartInfo.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden; process.StartInfo.FileName = "cmd.exe"; process.StartInfo.Arguments = "/C copy /b Image1.jpg + Archive.rar Image2.jpg"; process.Start(); 

con una referencia a Microsoft.VisualBasic

 Interaction.Shell("copy /b Image1.jpg + Archive.rar Image2.jpg", AppWinStyle.Hide); 

Puede hacer esto usando CliWrap en una línea:

 var stdout = new Cli("cmd") .Execute("copy /b Image1.jpg + Archive.rar Image2.jpg") .StandardOutput; 

Puede lograr esto utilizando el siguiente método (como se menciona en otras respuestas):

 strCmdText = "'/C some command"; Process.Start("CMD.exe", strCmdText); 

Cuando probé los métodos enumerados anteriormente, descubrí que mi comando personalizado no funcionaba con la syntax de algunas de las respuestas anteriores.

Descubrí que los comandos más complejos deben estar encapsulados entre comillas para funcionar:

 string strCmdText; strCmdText = "'/C cd " + path + " && composer update && composer install -o'"; Process.Start("CMD.exe", strCmdText);