Команды командной строки запуска

Есть ли способ запуска команд командной строки из приложения С#? Если да, то как бы я сделал следующее:

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

В основном это встраивает RAR файл в изображение JPG. Мне просто интересно, есть ли способ сделать это автоматически на С#.

Ответ 1

это все, что вам нужно сделать, запустить команды оболочки из С#

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

РЕДАКТИРОВАТЬ:

Это нужно, чтобы скрыть окно 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

Важно то, что аргумент начинается с /C иначе он не будет работать. Как сказал Скотт Фергюсон: "Выполняет команду, указанную строкой, а затем завершает".

Ответ 2

Попробовал решение @RameshVel, но я не смог передать аргументы в моем консольном приложении. Если кто-то испытывает ту же проблему, то это решение:

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

Ответ 3

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

Ответ 4

Хотя технически это напрямую не отвечает на поставленный вопрос, он отвечает на вопрос о том, как делать то, что хотел сделать оригинальный плакат: объединить файлы. Во всяком случае, это сообщение, чтобы помочь новичкам понять, о чем говорят Охотник за Экземпляром и Константин.

Это метод, который я использую для объединения файлов (в данном случае jpg и zip). Обратите внимание, что я создаю буфер, который заполняется содержимым zip файла (в небольших фрагментах, а не в одной большой операции чтения), а затем буфер записывается в конец файла jpg до конца zip файла достиг:

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

Ответ 5

Да, есть (см. ссылку в комментарии Мэтта Гамильтона), но было бы проще и лучше использовать классы .NET IO. Вы можете использовать File.ReadAllBytes для чтения файлов, а затем File.WriteAllBytes для записи "встроенной" версии.

Ответ 6

Ни один из приведенных выше ответов не помог по какой-то причине, похоже, что они подметают ошибки под ковриком и затрудняют поиск и устранение неполадок одной команды. Так что я закончил с чем-то вроде этого, возможно, это поможет кому-то еще:

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

Ответ 7

Вот небольшая простая и меньшая версия кода. Он также скроет окно консоли -

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

Ответ 8

со ссылкой на Microsoft.VisualBasic

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

Ответ 9

Вы можете сделать это, используя CliWrap в одной строке:

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

Ответ 10

Вы можете достичь этого, используя следующий метод (как упоминалось в других ответах):

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

Когда я попробовал методы, перечисленные выше, я обнаружил, что моя пользовательская команда не работает, используя синтаксис некоторых из приведенных выше ответов.

Я выяснил, что более сложные команды должны быть инкапсулированы в кавычки для работы:

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

Ответ 11

вы можете просто написать код в расширении формата .bat, код командного файла:

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

используйте этот код С#:

Process.Start("file_name.bat")