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 #.


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."


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

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

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

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

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


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".


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;

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


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

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

}

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

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


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
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.