Pregunta

¿Hay alguna forma de ejecutar los comandos de línea de comandos desde dentro de una aplicación C #? Si es así ¿cómo iba a hacer lo siguiente:

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

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

¿Fue útil?

Solución

Esto es todo lo que tiene que hacer comandos shell de ejecución de C #

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

EDIT:

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();

EDIT: 2

Lo importante es que el argumento comienza con /C de lo contrario no funcionará. Cómo Scott Ferguson dijo: "Realiza el comando especificado por la cadena y luego termina."

Otros consejos

Probado solución @RameshVel pero no podía pasar argumentos en mi aplicación de consola. Si alguien experimenta el mismo problema que 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, lo hace responder a la pregunta de cómo hacer lo que el cartel original quería hacer: combinar archivos. En todo caso, este es un post para ayudar a los novatos a entender lo Instancia Hunter y Konstantin están hablando.

Este es el método que utilizo para combinar archivos (en este caso un jpg y una cremallera). Tenga en cuenta que se crea un búfer que se llena con el contenido del archivo zip (en pequeños trozos 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 el final del archivo zip es 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í, hay (ver enlace en el comentario de Matt Hamilton), pero sería más fácil y mejor utilizar clases de .NET IO. Puede utilizar File.ReadAllBytes para leer los archivos y luego File.WriteAllBytes para escribir la versión "incrustado".

Ninguna de las respuestas anteriores ayudó por alguna razón, parece que barren bajo la alfombra los errores y hacer que la solución de problemas de comandos de uno difícil. Así que terminé yendo con algo como esto, tal vez va a 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();

Puede hacer esto utilizando CliWrap en una línea:

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

Aquí es poco sencilla y menos la versión del código. Se ocultará la ventana de la consola también -

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);

Si desea mantener abierta la ventana de cmd o si desea utilizar en WinForm / WPF luego usarlo como esto

    string strCmdText;
//For Testing
    strCmdText= "/K ipconfig";

 System.Diagnostics.Process.Start("CMD.exe",strCmdText);
  

/ K

Se mantendrá abierta la ventana cmd

Esto se puede conseguir mediante el siguiente método (como se ha mencionado en otras respuestas):

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

Cuando traté de los métodos mencionados anteriormente encontré que mi comando personalizado no funcionaba utilizando la sintaxis de algunas de las respuestas anteriores.

Me enteré de comandos más complejos necesitan ser encapsulada entre comillas para trabajar:

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

puede utilizar simplemente hay que escribir el código en una extensión de formato .bat, el código del archivo por lotes:

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

utilizar el código C #:

Process.Start("file_name.bat")

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top