سؤال

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

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

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

هل كانت مفيدة؟

المحلول

هذا هو كل ما عليك القيام به أوامر 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 خلاف ذلك لن تعمل. كيف سكوت فيرجسون قال: "ينفذ الأمر الذي حددته السلسلة ثم ينتهي."

نصائح أخرى

حاول @ 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());
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);

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

هذه هي الطريقة التي أستخدمها لدمج الملفات (في هذه الحالة JPG والرمز البريدي). لاحظ أنني قمت بإنشاء مخزن مؤقت يتم ملء محتوى ملف 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);
            }
        }
    }
}

نعم، هناك (انظر الرابط في تعليق Matt Hamilton)، ولكن سيكون الأمر أسهل وأفضل استخدام فصول الاتصالات io. يمكنك استخدام File.ReadallBytes لقراءة الملفات ثم ملف.writeallbytes لكتابة الإصدار "المضمن".

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

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

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

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

هنا هو بسيط بسيط وبسيط التعليمات البرمجية. سوف يخفي نافذة وحدة التحكم أيضا

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

مع إشارة إلى Microsoft.VisualBasic

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

إذا كنت ترغب في الحفاظ على نافذة CMD مفتوحة أو ترغب في استخدامها في WinForm / WPF، فاستخدمها مثل هذا

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

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

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

يمكنك تحقيق ذلك باستخدام الطريقة التالية (كما هو مذكور في إجابات أخرى):

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

يمكنك استخدام ببساطة كتابة التعليمات البرمجية في .bat امتداد التنسيق، رمز ملف الدفعات:

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

استخدم رمز C #:

Process.Start("file_name.bat")

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top