Pergunta

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

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

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

Foi útil?

Solução

isso é tudo que você precisa fazer comandos shell executados a partir de C #

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

EDIT:

Esta é para ocultar a janela 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 vai funcionar. Como Scott Ferguson disse: "Executa o comando especificado pela seqüência e depois termina" it

Outras dicas

solução @RameshVel Tentei mas não consegui passar argumentos em meu aplicativo de console. Se alguém experimenta o mesmo problema aqui é 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 responde directamente questão colocada, que faz responder à pergunta de como fazer o que o poster original queria fazer: combinar arquivos. Se qualquer coisa, este é um post para ajudar os novatos entender o que Instância Hunter e Konstantin estão falando.

Este é o método que eu uso para combinar arquivos (neste caso, um jpg e um zip). Nota que eu criar um buffer que é preenchido com o conteúdo do arquivo zip (em pequenos pedaços, em vez de em uma operação lido grande), e, em seguida, o buffer é escrito na parte de trás do arquivo jpg até o final do arquivo zip é 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, há (veja link no comentário de Matt Hamilton), mas seria mais fácil e melhor usar classes IO do .NET. Você pode usar File.ReadAllBytes para ler os arquivos e, em seguida, File.WriteAllBytes para escrever a versão "embedded".

Nenhuma das respostas acima ajudaram, por alguma razão, parece que eles varrem erros debaixo do tapete e fazer a solução de problemas um de comandar difícil. Então eu acabei indo com algo como isso, talvez ele vai ajudar 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();

Você pode fazer isso usando CliWrap em uma linha:

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

Aqui é um pouco simples e menos versão do código. Ele irá 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 a Microsoft.VisualBasic

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

Se você quiser manter a janela cmd aberto ou quiser usá-lo em winform / WPF, em seguida, usá-lo como este

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

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

/ K

Irá manter a janela do cmd aberto

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

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

Quando eu tentei os métodos listados acima eu descobri que o meu comando personalizado não trabalhar usando a sintaxe de algumas das respostas acima.

Eu descobri comandos mais complexos precisam ser encapsulado em aspas para trabalho:

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

Você pode usar simplesmente escrever o código em uma extensão do formato .bat, o código do arquivo em lotes:

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

usar este código c #:

Process.Start("file_name.bat")

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top