Команды командной строки запуска
Есть ли способ запуска команд командной строки из приложения С#? Если да, то как бы я сделал следующее:
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")