Jalankan Perintah Prompt Perintah

605

Apakah ada cara untuk menjalankan perintah command prompt dari dalam aplikasi C #? Jika demikian, bagaimana saya akan melakukan hal berikut:

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

Ini pada dasarnya menanamkan file RAR dalam gambar JPG. Saya hanya ingin tahu apakah ada cara untuk melakukan ini secara otomatis di C #.

pengguna
sumber
6
Gandakan stackoverflow.com/questions/181719/… (ada jawaban di sana yang melakukan apa yang Anda inginkan).
Matt Hamilton
stackoverflow.com/a/5367686/492 memiliki jawaban yang lebih baik
CAD cowok

Jawaban:

918

ini yang harus Anda lakukan menjalankan perintah shell dari C #

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

EDIT:

Ini untuk menyembunyikan jendela 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

Penting adalah bahwa argumen dimulai dengan /Cjika tidak maka tidak akan berhasil. Bagaimana Scott Ferguson berkata: "Lakukan perintah yang ditentukan oleh string dan kemudian berakhir."

RameshVel
sumber
166
/ C Melaksanakan perintah yang ditentukan oleh string dan kemudian berakhir
Scott Ferguson
16
hanya untuk memberitahu cmd untuk menjalankan dan mengakhiri (menunggu Dont untuk setiap input pengguna untuk menutup jendela)
RameshVel
3
Terima kasih, satu pertanyaan lagi. Apakah ada cara untuk menyembunyikan prompt perintah selama ini?
pengguna
9
Saya tidak melihat bagaimana saya satu-satunya yang berpikir ini adalah ide yang mengerikan. Ya, ini akan berhasil, tetapi itu sepenuhnya dan benar-benar salah. Memunculkan proses CMD untuk melakukan operasi IO sederhana adalah salah, bahkan jika itu berhasil. Baca dokumentasi di namespace System.IO. Ada lebih dari cukup fungsionalitas di sana untuk melakukan apa yang perlu Anda lakukan tanpa memunculkan proses yang tidak dibutuhkan.
Instance Hunter
56
FYI: Gunakan process.WaitForExit () untuk menunggu proses selesai sebelum melanjutkan dan memproses.ExitCode untuk mendapatkan kode keluar dari proses.
shindigo
122

Mencoba solusi @RameshVel tapi saya tidak bisa meneruskan argumen di aplikasi konsol saya. Jika ada yang mengalami masalah yang sama di sini adalah solusinya:

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());
Ogglas
sumber
2
baik saya tidak memberikan kesempatan berpikir bahwa pada mesin saya ada beberapa admin atau batasan anti virus tapi .. kode di atas berfungsi! terima kasih Ogglas
Pete Kozak
6
baris ini: cmd.StartInfo.CreateNoWindow = true; menyelamatkan hari saya.
Ganesh Kamath - 'Code Frenzy'
Apakah ada cara menjalankan beberapa perintah dalam satucmd.StandardInput.WriteLine(@"cd C:\Test; pwd")
Zach Smith
36
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);
HackerMan
sumber
2
Apa itu @tanda masuk C #?
Pacerier
6
@Pacerier Ia memberitahu kompiler untuk keluar dari semua karakter yang biasanya harus diloloskan dalam string, dalam kasus ini \. Jadi, tanpa \, kode Anda akan terlihat sepertiproc1.FileName = "C:\\Windows\\System32\\cmd.exe";
James Ko
1
Orang harus mencatat bahwa proc1.Verb = "runas";membuat proses ini berjalan dengan hak istimewa yang tinggi ... Ini tidak selalu dimaksudkan.
Dinei
1
Bagaimana saya bisa membuat jendela cmd ini tidak menutup setelah selesai?
Hrvoje T
1
Saya menemukan bahwa memanggil 'jalur cd' yang bergabung dengan '&&' dengan perintah lain di baris selalu dijalankan terakhir meskipun sudah duluan. Anda: 'proc1.WorkingDirectory = @ "C: \ Windows \ System32";' sangat membantu! Terima kasih!
Nozim Turakulov
11

Tidak ada jawaban di atas yang membantu karena beberapa alasan, sepertinya mereka menyapu kesalahan di bawah permadani dan membuat pemecahan masalah perintah seseorang menjadi sulit. Jadi saya berakhir dengan sesuatu seperti ini, mungkin itu akan membantu orang lain:

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();
Matt Bonness
sumber
Jika saya ingin mengkompilasi ini menjadi aplikasi konsol yang berdiri sendiri, kode lain apa yang harus ditambahkan untuk membuatnya berfungsi? (Saya pemula untuk semua hal pemrograman ini, hanya melakukan beberapa scripting) Saya menggunakan csc.exe btw.
script'n'code
@ copyitright Ruang nama dan kelas. Jika Anda baru saja membuat proyek baru, mereka akan dibuat untuk Anda.
coinbird
Ah. sudahlah. jika Anda menggunakan cmd.exeaplikasi, Anda dapat memberikan perintah sebagai argumen.
Zach Smith
Untuk keturunan: Saya ingin proses untuk menjalankan echo Hello World!dan menampilkan output perintah di jendela cmd yang muncul. Jadi saya mencoba: Filename = @"echo", Arguments = "Hello World!", UseShellExecute = false, RedirectStandardOuput = false, CreateNoWindow = false. Ini memungkinkan jendela cmd dari aplikasi induk untuk menampilkan "Hello World!" (Yang masuk akal karena stdout tidak dialihkan ke proses anak).
Minh Tran
10

Meskipun secara teknis ini tidak secara langsung menjawab pertanyaan yang diajukan, itu menjawab pertanyaan tentang bagaimana melakukan apa yang ingin dilakukan poster asli: menggabungkan file. Jika ada, ini adalah pos untuk membantu pemula memahami apa yang dibicarakan oleh Instance Hunter dan Konstantin.

Ini adalah metode yang saya gunakan untuk menggabungkan file (dalam hal ini jpg dan zip). Perhatikan bahwa saya membuat buffer yang terisi dengan konten file zip (dalam potongan kecil daripada dalam satu operasi baca besar), dan kemudian buffer dituliskan di bagian belakang file jpg sampai akhir file zip adalah tercapai:

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);
            }
        }
    }
}
CarllDev
sumber
9

jika Anda ingin membiarkan jendela cmd terbuka atau ingin menggunakannya di winform / wpf maka gunakan seperti ini

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

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

/ K

Akan membuat jendela cmd tetap terbuka

Desain unik
sumber
Bagus. Ditemukan dokumentasi ini untuk cmdperintah dan parameternya.
pius
8

Ya, ada (lihat tautan dalam komentar Matt Hamilton), tetapi akan lebih mudah dan lebih baik untuk menggunakan kelas IO .NET. Anda dapat menggunakan File.ReadAllBytes untuk membaca file dan kemudian File.WriteAllBytes untuk menulis versi "tertanam".

Pemburu Instance
sumber
11
Memuat seluruh file ke dalam memori hanya untuk menambahkan satu ke yang lain tidak terlalu efisien, terutama jika file cukup besar.
Konstantin Spirin
7
Coba tengok semangat jawabannya. Intinya. NET memiliki lebih dari cukup kelas IO dan fungsi untuk melakukan ini tanpa harus memanggil shell OS. Fungsi khusus yang saya sebutkan mungkin bukan yang terbaik, tetapi itu hanya yang paling sederhana. Tidak masuk akal sama sekali untuk memanggil shell untuk melakukan ini.
Instance Hunter
7

Anda dapat melakukan ini menggunakan CliWrap dalam satu baris:

var stdout = new Cli("cmd")
         .Execute("copy /b Image1.jpg + Archive.rar Image2.jpg")
         .StandardOutput;
Tyrrrz
sumber
Saya membenarkan ini ... tetapi repo tampaknya hilang sekarang:Unable to find package 'CliWrap' at source
Zach Smith
1
@ZachSmith tidak yakin apa yang Anda maksud, nuget.org/packages/CliWrap tampaknya berfungsi dengan baik. Tautan asli juga.
Tyrrrz
Ah. Maaf .. karena suatu alasan ketika saya tidak dapat terhubung ke repo nuget saya melalui vpn, saya tidak dapat menginstal paket ini. nuget sebagian besar masih menjadi misteri bagi saya. pasti salah mengaturnya
Zach Smith
6

dengan referensi ke Microsoft.VisualBasic

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

Ini adalah versi kode yang sedikit sederhana dan kurang. Ini akan menyembunyikan jendela konsol juga-

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();
kamalpreet
sumber
5

jika Anda ingin menjalankan perintah dalam mode async - dan cetak hasilnya. Anda dapat kelas ini:

    public static class ExecuteCmd
{
    /// <summary>
    /// Executes a shell command synchronously.
    /// </summary>
    /// <param name="command">string command</param>
    /// <returns>string, as output of the command.</returns>
    public static void ExecuteCommandSync(object command)
    {
        try
        {
            // create the ProcessStartInfo using "cmd" as the program to be run, and "/c " as the parameters.
            // Incidentally, /c tells cmd that we want it to execute the command that follows, and then exit.
            System.Diagnostics.ProcessStartInfo procStartInfo = new System.Diagnostics.ProcessStartInfo("cmd", "/c " + command);
            // The following commands are needed to redirect the standard output. 
            //This means that it will be redirected to the Process.StandardOutput StreamReader.
            procStartInfo.RedirectStandardOutput =  true;
            procStartInfo.UseShellExecute = false;
            // Do not create the black window.
            procStartInfo.CreateNoWindow = true;
            // Now we create a process, assign its ProcessStartInfo and start it
            System.Diagnostics.Process proc = new System.Diagnostics.Process();
            proc.StartInfo = procStartInfo;
            proc.Start();

            // Get the output into a string
            string result = proc.StandardOutput.ReadToEnd();

            // Display the command output.
            Console.WriteLine(result);
        }
        catch (Exception objException)
        {
            // Log the exception
            Console.WriteLine("ExecuteCommandSync failed" + objException.Message);
        }
    }

    /// <summary>
    /// Execute the command Asynchronously.
    /// </summary>
    /// <param name="command">string command.</param>
    public static void ExecuteCommandAsync(string command)
    {
        try
        {
            //Asynchronously start the Thread to process the Execute command request.
            Thread objThread = new Thread(new ParameterizedThreadStart(ExecuteCommandSync));
            //Make the thread as background thread.
            objThread.IsBackground = true;
            //Set the Priority of the thread.
            objThread.Priority = ThreadPriority.AboveNormal;
            //Start the thread.
            objThread.Start(command);
        }
        catch (ThreadStartException )
        {
            // Log the exception
        }
        catch (ThreadAbortException )
        {
            // Log the exception
        }
        catch (Exception )
        {
            // Log the exception
        }
    }

}
Elad
sumber
2

Anda dapat mencapai ini dengan menggunakan metode berikut (sebagaimana disebutkan dalam jawaban lain):

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

Ketika saya mencoba metode yang tercantum di atas saya menemukan bahwa perintah kustom saya tidak berfungsi menggunakan sintaks dari beberapa jawaban di atas.

Saya menemukan perintah yang lebih kompleks perlu dienkapsulasi dalam tanda kutip agar berfungsi:

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

Anda dapat menggunakan cukup menulis kode dalam .batekstensi format, kode file batch:

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

gunakan kode c # ini:

Process.Start("file_name.bat")

XMMR12
sumber
jika Anda ingin menyembunyikan cmd saat menjalankan, Anda dapat menggunakan kode skrip visual basic sederhana dalam .vbsekstensi format, kode:CreateObject("Wscript.Shell").Run "filename.bat",0,True
XMMR12