Komut İstemi Komutlarını Çalıştırma


605

Komut istemi komutlarını bir C # uygulamasından çalıştırmanın herhangi bir yolu var mı? Öyleyse aşağıdakileri nasıl yaparım:

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

Bu temelde bir RAR dosyasını JPG görüntüsü içine gömer. Ben sadece bunu C # otomatik olarak yapmanın bir yolu olup olmadığını merak ediyordum.


6
Kopyası stackoverflow.com/questions/181719/... (bir cevap bu istediğini orada yapar yoktur).
Matt Hamilton

stackoverflow.com/a/5367686/492 daha iyi bir cevabı var
CAD bloke

Yanıtlar:


918

C # 'dan shell komutlarını çalıştırmak için yapmanız gereken tek şey bu

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

DÜZENLE:

Bu cmd penceresini gizlemek içindir.

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

DÜZENLEME: 2

Önemli olan argüman ile başlar /Caksi takdirde işe yaramaz. Scott Ferguson nasıl dedi: "Dize tarafından belirtilen komutu yerine getirir ve sonra sona erer."


166
/ C Dize ile belirtilen komutu yerine getirir ve sonra sonlandırır
Scott Ferguson

16
sadece cmd çalıştırmak ve sonlandırmak için söylemek (herhangi bir kullanıcı girişi pencereyi kapatmak için
beklemeyin

3
Teşekkürler, bir soru daha. Bu sırada komut istemini gizlemenin bir yolu var mı?
kullanıcı

9
Bunun korkunç bir fikir olduğunu düşünen tek kişi olduğumu görmüyorum. Evet, bu işe yarayacak, ama tamamen ve tamamen yanlış. Basit IO işlemleri yapmak için CMD süreçlerini yumurtlamak işe yarasa bile yanlıştır. System.IO ad alanındaki belgeleri okuyun. Gereksiz süreçleri yumurtlamadan yapmanız gerekenleri yapmak için yeterli işlevsellik var.
Örnek Avcı

56
Bilginize: Devam etmeden önce işlemin tamamlanmasını beklemek için process.WaitForExit () yöntemini ve işlemin çıkış kodunu almak için.ExitCode öğesini kullanın.
shindigo

122

@RameshVel çözümünü denedim ancak konsol uygulamamda argümanlar iletemedim. Burada aynı sorunu yaşayan bir çözüm varsa:

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
Peki benim makine üzerinde bazı yönetici veya anti virüs kısıtlamaları olduğunu düşünme şansı vermedim ama .. yukarıdaki kod çalışır! teşekkürler Ogglas
Pete Kozak

6
bu satır: cmd.StartInfo.CreateNoWindow = true; günümü kurtardım.
Ganesh Kamath - 'Code Frenzy'

Tek bir komutta birden fazla komut cmd.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
@C # 'daki oturum nedir ?
Pacerier

6
@Pacerier Derleyiciye normalde dizede kaçması gereken tüm karakterlerden kaçmasını söyler, bu durumda \. Yani \ olmadan kodunuz şöyle görünürproc1.FileName = "C:\\Windows\\System32\\cmd.exe";
James Ko

1
proc1.Verb = "runas";Bu sürecin yükseltilmiş ayrıcalıklarla çalışmasını sağlamak gerekir ... Bu her zaman amaçlanmamıştır.
Dinei

1
Bu cmd penceresinin bittikten sonra kapanmamasını nasıl sağlayabilirim?
Hrvoje T

1
Satırdaki diğer komutlarla '&&' ile birleştirilen 'cd yolu' çağrısının, ilk gitse bile her zaman en son yürütüldüğünü buldum. sizin: 'proc1.WorkingDirectory = @ "C: \ Windows \ System32";' çok yardımcı oldu! Teşekkürler!
Nozim Turakulov

11

Yukarıdaki cevapların hiçbiri bir nedenden dolayı yardımcı olmadı, halıdaki hataları süpürüyor ve komutun sorununu gidermeyi zorlaştırıyor gibi görünüyor. Bu yüzden böyle bir şeyle devam ettim, belki başka birine yardımcı olacak:

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

Bunu tek başına bir konsol uygulamasında derlemek istersem, çalışması için başka hangi kodun eklenmesi gerekir? (Ben tüm bu programlama şeyler bir çaylak, sadece bazı komut dosyası yaptım). Csc.exe btw kullanıyorum.
script'n'code

@copyitright Bir ad alanı ve sınıf. Sadece yeni bir proje oluşturursanız, bunlar sizin için üretilecektir.
coinbird

Ah. boşver. cmd.exeuygulamayı kullanırsanız, komutları bağımsız değişken olarak iletebilirsiniz.
Zach Smith

Posterity için: İşlemin çalışmasını echo Hello World!ve açılan cmd penceresinde komut çıktısını görüntülemesini istedim . Denedim Yani: Filename = @"echo", Arguments = "Hello World!", UseShellExecute = false, RedirectStandardOuput = false, CreateNoWindow = false. Bu, üst uygulamanın cmd penceresinin "Merhaba Dünya!" (stdout alt sürece yeniden yönlendirilmediğinden mantıklıdır).
Minh Tran

10

Teknik olarak bu doğrudan sorulan soruyu cevaplamasa da, orijinal posterin ne yapmak istediğini nasıl cevaplayacağı sorusunu cevaplıyor: dosyaları birleştirin. Bir şey varsa, bu yeni başlayanların Instance Hunter ve Konstantin hakkında neler konuştuğunu anlamalarına yardımcı olan bir yazıdır.

Dosyaları birleştirmek için kullandığım yöntem budur (bu durumda bir jpg ve zip). Zip dosyasının içeriği ile doldurulan bir arabellek oluşturduğumu (bir büyük okuma işleminden ziyade küçük parçalar halinde) ve arabellek zip dosyasının sonuna kadar jpg dosyasının arkasına yazıldığını unutmayın ulaşıldı:

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

cmd penceresini açık tutmak veya winform / wpf içinde kullanmak istiyorsanız, bu şekilde kullanın

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

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

/ K

Cmd penceresini açık tutacak


Güzel. Komut ve parametreleri için bu dokümanı bulducmd .
pius

8

Evet, (Matt Hamilton'ın yorumundaki bağlantıya bakın), ancak .NET'in IO sınıflarını kullanmak daha kolay ve daha iyi olurdu. Dosyaları okumak için File.ReadAllBytes komutunu, sonra da "katıştırılmış" sürümü yazmak için File.WriteAllBytes komutunu kullanabilirsiniz.


11
Sadece bir diğerine eklemek için tüm dosyaları belleğe yüklemek, özellikle dosyalar yeterince büyükse, çok verimli değildir.
Konstantin Spirin

7
Cevabın ruhuna bakmaya çalışın. Buradaki nokta, .NET'in OS kabuğuna çağrı yapmak zorunda kalmadan bunu yapmak için yeterli IO sınıfına ve fonksiyonuna sahip olmasıdır. Bahsettiğim belirli fonksiyonlar en iyisi olmayabilir, ancak bunlar sadece en basitti. Bunu yapmak için kabuğa seslenmek hiç mantıklı değil.
Örnek Avcı

7

Bunu bir satırda CliWrap kullanarak yapabilirsiniz :

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

Bunu iptal ettim ... ama repo şimdi eksik gibi görünüyor:Unable to find package 'CliWrap' at source
Zach Smith

1
@ZachSm ne demek istediğinizden emin değilim, nuget.org/packages/CliWrap iyi çalışıyor gibi görünüyor. Orijinal bağlantı da.
Tyrrrz

Ah.sorry .. vpn üzerinden nuget repo'ma bağlanamadığım için bu paketi yükleyemedim. nuget hala benim için bir sır. yanlış ayarlamış olmalı
Zach Smith


5

İşte biraz basit ve daha az kod versiyonu. Konsol penceresini de gizleyecektir.

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

komutu asenkron modda çalıştırmak ve sonuçları yazdırmak istiyorsanız. bu sınıfı yapabilirsiniz:

    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

Bunu, aşağıdaki yöntemi kullanarak yapabilirsiniz (diğer yanıtlarda belirtildiği gibi):

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

Yukarıda listelenen yöntemleri denediğimde, özel komutumun yukarıdaki cevaplardan bazılarının sözdizimini kullanarak çalışmadığını gördüm.

Çalışmak için daha karmaşık komutların tırnak içine alınması gerektiğini öğrendim:

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

1

.batkodu, toplu iş dosyasının kodunu bir biçim uzantısında yazmak için kullanabilirsiniz :

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

bu c # kodunu kullanın:

Process.Start("file_name.bat")


.vbsCreateObject("Wscript.Shell").Run "filename.bat",0,True
Çalışırken cmd'yi
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.