قم بتشغيل أوامر موجه الأوامر

سئل على ٢٤ سبتمبر ٢٠٠٩  ·  تمت مشاهدة 1M مرة  ·  مصدر

user picture
في ٢٤ سبتمبر ٢٠٠٩

هل هناك أي طريقة لتشغيل أوامر موجه الأوامر من داخل تطبيق C #؟ إذا كان الأمر كذلك ، فكيف أفعل ما يلي:

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

هذا يدمج بشكل أساسي ملف RAR داخل صورة JPG. كنت أتساءل فقط عما إذا كانت هناك طريقة للقيام بذلك تلقائيًا في C #.

الإجابات

RameshVel picture
في ٢٤ سبتمبر ٢٠٠٩
963

هذا كل ما عليك القيام به لتشغيل أوامر shell من C #

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

تحرير: 2

المهم أن تبدأ الوسيطة بـ /C وإلا فلن تعمل. كيف قال سكوت فيرجسون : "ينفذ الأمر الذي حددته السلسلة ثم ينتهي".

Ogglas picture
في ٣٠ سبتمبر ٢٠١٥
130

حاولت حل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());
HackerMan picture
في ٤ أبريل ٢٠١٤
37
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);
Matt picture
في ٢٤ يناير ٢٠١٧
12

لم تساعد أي من الإجابات المذكورة أعلاه لسبب ما ، يبدو أنها تكتسح الأخطاء تحت السجادة وتجعل استكشاف الأخطاء وإصلاحها أمرًا صعبًا. لذلك انتهى بي الأمر مع شيء كهذا ، ربما سيساعد شخصًا آخر:

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();
CarllDev picture
في ٤ مارس ٢٠١٤
10

على الرغم من أن هذا من الناحية الفنية لا يجيب مباشرة على السؤال المطروح ، إلا أنه يجيب على السؤال حول كيفية القيام بما أراد الناشر الأصلي القيام به: دمج الملفات. إذا كان هناك أي شيء ، فهذا منشور لمساعدة المبتدئين على فهم ما يتحدث عنه Instance Hunter و Konstantin.

هذه هي الطريقة التي أستخدمها لدمج الملفات (في هذه الحالة ، jpg و zip). لاحظ أنني أقوم بإنشاء مخزن مؤقت مملوء بمحتوى الملف المضغوط (في أجزاء صغيرة بدلاً من عملية قراءة كبيرة واحدة) ، ثم تتم كتابة المخزن المؤقت في الجزء الخلفي من ملف jpg حتى نهاية الملف المضغوط. وصلت:

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);
            }
        }
    }
}
Uniquedesign picture
في ١٣ فبراير ٢٠١٩
10

إذا كنت تريد إبقاء نافذة cmd مفتوحة أو تريد استخدامها في winform / wpf ، فاستخدمها على هذا النحو

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

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

سوف تبقي نافذة cmd مفتوحة

Instance Hunter picture
في ٢٤ سبتمبر ٢٠٠٩
8

نعم ، هناك (انظر الرابط في تعليق مات هاميلتون) ، ولكن سيكون من الأسهل والأفضل استخدام فئات IO الخاصة بـ .NET. يمكنك استخدام File.ReadAllBytes لقراءة الملفات ثم File.WriteAllBytes لكتابة الإصدار "المضمن".

Slai picture
في ٢٥ أغسطس ٢٠١٦
7

بإشارة إلى Microsoft.VisualBasic

Interaction.Shell("copy /b Image1.jpg + Archive.rar Image2.jpg", AppWinStyle.Hide);
Tyrrrz picture
في ٢٩ أكتوبر ٢٠١٧
7

يمكنك القيام بذلك باستخدام CliWrap في سطر واحد:

var stdout = new Cli("cmd")
         .Execute("copy /b Image1.jpg + Archive.rar Image2.jpg")
         .StandardOutput;
Elad picture
في ٨ ديسمبر ٢٠١٩
7

إذا كنت تريد تشغيل الأمر في الوضع غير المتزامن - وطباعة النتائج. يمكنك هذا الفصل:

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

}