Executar comandos do prompt de comando

Existe alguma maneira de executar comandos de prompt de comando de dentro de um aplicativo c #? Se sim, como eu faria o seguinte:

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

Isso basicamente embute um arquivo RAR dentro da imagem JPG. Eu só estava me perguntando se havia uma maneira de fazer isso automaticamente em c #.

    isso é tudo que você tem que fazer executar comandos shell de c #

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

    EDITAR:

    Isso é para esconder a janela do 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

    Importante é que o argumento começa com /C caso contrário não funcionará. Como Scott Ferguson disse: “Executa o comando especificado pela string e depois termina.”

    Tentei solução @RameshVel, mas eu não podia passar argumentos no meu aplicativo de console. Se alguém experimenta o mesmo problema, aqui está uma solução:

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

    Embora tecnicamente isso não responda diretamente à questão colocada, ela responde à pergunta de como fazer o que o pôster original queria: combinar arquivos. Se alguma coisa, este é um post para ajudar os iniciantes a entender o que Instance Hunter e Konstantin estão falando.

    Este é o método que eu uso para combinar arquivos (neste caso, um jpg e um zip). Note que eu crio um buffer que é preenchido com o conteúdo do arquivo zip (em pequenos pedaços em vez de em uma grande operação de leitura), e então o buffer é gravado na parte de trás do arquivo jpg até o final do arquivo zip ser alcançado:

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

    Sim, existe (veja o link no comentário de Matt Hamilton), mas seria mais fácil e melhor usar as classs IO do .NET. Você pode usar File.ReadAllBytes para ler os arquivos e, em seguida, File.WriteAllBytes para gravar a versão “incorporada”.

    Nenhuma das respostas acima ajudou por algum motivo, parece que eles varrem os erros embaixo do tapete e dificultam a solução de problemas do comando de alguém. Então acabei indo com algo assim, talvez ajude alguém:

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

    Aqui está uma versão simples e com menos código. Ele vai esconder a janela do console também

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

    com uma referência para Microsoft.VisualBasic

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

    Você pode fazer isso usando o CliWrap em uma linha:

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

    Você pode conseguir isso usando o seguinte método (como mencionado em outras respostas):

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

    Quando tentei os methods listados acima, descobri que meu comando personalizado não funcionava usando a syntax de algumas das respostas acima.

    Descobri que comandos mais complexos precisam ser encapsulados entre aspas para funcionar:

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