السلام عليكم ورحمة الله وبركاته
أريد تشغيل برنامج مكتوب بلغة بيرل من داخل برنامجي C#.net
ينفذ البرنامج في
command prompt
بالسطر
perl program.pl <input >output
فكيف أقوم بذلك بضغطة زر
من داخل البرنامج
ولكم جزيل الشكر
السلام عليكم ورحمة الله وبركاته
أريد تشغيل برنامج مكتوب بلغة بيرل من داخل برنامجي C#.net
ينفذ البرنامج في
command prompt
بالسطر
perl program.pl <input >output
فكيف أقوم بذلك بضغطة زر
من داخل البرنامج
ولكم جزيل الشكر
رجاء التوضيح !! وعندي احساس أنه واجب وحل الواجبات ممنوع هنا في المنتدى.
عموما اذا كنت تستخدم Perl أو كتبت بها كود تريد اعادة استخدامه في السي شارب , فيمكن بـ Perl تقريبا الآن أن تكتب برامج لـ و بـ الدوت نت. فاذا كنت تريد استخدام Perl مع السي شارب فاكتب DLLs بها وبعد ذلك ضفها كـ Reference لبرنامج السي شارب وتعامل مع الـ DLL بطريقه عاديه. وذلك مع مع مراعاة الـ CLS.
على العموم ليس واجب
وجدت برنامج يتعامل مع النصوص مكتوب بلغة بيرل
وأريد أن أرسل المدخلات من
text box
وأعرض المخرجات في
text box
آخر
لاغير
أريد أن يظهر البرنامج وكأنه جزء داخل البرنامج بحيث لا يعلم المستخدم أن هناك برنامج آخر
أريد أن أستخدم هذا البرنامج كجزء من البرنامج
لأن برنامجي أكبر من كذا
ووجدت برنامج بلغة البيرل يقوم بجزء من العمل
بدل أن أعيد كتابته أريد استدعائه داخل برنامجي
remote-call .or something
وشكراً
اذا فاستخدم Process الموجوده في Diagnostics كما قال bashmohandes واجعل الـ CreateNoWindow بـ true حتى لا تظهر نافذة البرنامج الآخر للمستخدم. وأيضا اجعل RedirectStandardOutput بـ true و UseShellExecute بـ false حتى نسترجع المخرجات في StreamReader جديد نصل له من خلال الخاصيه StandardOutput وبعد ذلك نتعامل معه كما نريد.
مثلا :
System.Diagnostics.Process yourPro = new System.Diagnostics.Process();
yourPro.StartInfo = new System.Diagnostics.ProcessStartInfo("yourApp","yourArgs");
yourPro.StartInfo.CreateNoWindow = true;
yourPro.StartInfo.RedirectStandardOutput = true;
yourPro.StartInfo.UseShellExecute = false;
yourPro.Start();
yourOutputTextBox.Text = yourPro.StandardOutput.ReadToEnd();طبعا StandardOutput ترجع StreamReader بالمخرجات وأنا استخدمت ReadToEnd مباشرة , ولكن يمكنك أنت على حسب الـ OutPut أن تستخدم الـ Methods الأخرى الموجوده الخاصه بقراءة أجزاء أو أسطر محدده مثل ReadBlock و Read و ReadLine والخ.
أيضا في الـ Constructor الخاص بالـ ProcessStartInfo تمرر أولا عنوان البرنامج ثم الـ Arguments. ويمكنك استبدال yourArgs بالـ TextBox.Text الخاص بالمدخلات Input.
تم تعديل هذه المشاركة بواسطة معتز شمس في 21 فبراير 2006 في 16:21
معتز كيف يمكن أرسال Text إلي App ؟؟؟
تم تعديل هذه المشاركة بواسطة R0OT في 22 فبراير 2006 في 08:21
هل هذا استفسار أم تعليق على الكود أخي R0OT :) ؟ لم أفهم , عموما أنت ترسل الـ Arguments للبرنامج كـ string وبالطبع البرنامج الآخر يجب ان يكون مهيئ نفسه لذلك بوضع الكود المناسب في الـ ()Main حتى يستقبل ويتعامل مع هذه الـ Arguments. والـ Arguments تكون دائما string. تماما كما نكتب Ping Yahoo.com فنحن به نفتح برنامج Ping ونمرر له اسم موقع أو رقم IP كـ string وPing مهيئ نفسه للتعامل مع الأشياء التي تمرر له.
هذا أستفسار أريد علي سبيل المثال أرسال أوامر لل cmd و تكملتها في نفس ال Process
للأسف لم يعمل معي الحل جيداً
تمكنت من حلها بالطريقة
System.Diagnostics.Process myProcess = new System.Diagnostics.Process();
myProcess.StartInfo.FileName="cmd.exe";
myProcess.StartInfo.RedirectStandardInput=true;
myProcess.StartInfo.CreateNoWindow = true;
myProcess.StartInfo.UseShellExecute = false;
myProcess.Start();
myProcess.StandardInput.WriteLine("perl program.pl <input.txt >output.txt");
myProcess.Close();بحيث اشغل
command prompt
واكتب فيه الأمر
ولكن أعتقد أنها طريقة متخلفة
هل من طريقة أفضل
جزيتم خيرا
برضه رجعنه تاني لل txt :(
مفيش حل يعني يا جماعة ؟؟؟ في أيه يا معتز ؟؟؟ مفيش أجابة عندك ؟؟؟
أنا مش فاهمك يا R0OT ! اشرح ماتريد عمله بطريقه مفصله قليلا. فماذا تقصد بمشكلة الـ Text ؟ فالكود يرسل الـ Arguments كنص ويستقبل الـ Output كنص أيضا. فأين المشكله ؟ ماذا تريد أن تفعل تحديدا ؟
فكرة بسيطة كنت دوبت فيها بالفيجوال بيسك 6 و عملتها بس بال api عاوز أدخل أوامر و أخد إلي طالع من ال cmd بس دي صعبة ؟؟؟ عارف شبه أيه شبة ال Console في ال SharpDevelop بس
ماهو الكود اللي أنا كتبته فوق بيعمل كدا تماما يا R0OT (h) !
اكتب هذا الكود ,فانه يرسل أمر Ping Yahoo.com للـ CMD ويستقبل المخرجات كالتي تظهر تماما في الـ CMD اذا كتبنا نفس الأمر هناك ! :
System.Diagnostics.Process yourPro = new System.Diagnostics.Process();
yourPro.StartInfo = new System.Diagnostics.ProcessStartInfo("Ping","yahoo.com");
yourPro.StartInfo.CreateNoWindow = true;
yourPro.StartInfo.RedirectStandardOutput = true;
yourPro.StartInfo.UseShellExecute = false;
yourPro.Start();
System.IO.StreamReader myR = yourPro.StandardOutput;
MessageBox.Show(myR.ReadToEnd()); myR.Close();ويمكنك بعد ذلك حفظ المخرجات في ملف اذا أردت من خلال StreamWriter أو بارسال الأمر الخاص بذلك مباشرة.
تم تعديل هذه المشاركة بواسطة معتز شمس في 26 فبراير 2006 في 05:18
طيب أنت لم تغلق ال yourPro.StartInfo و هذا هو المطلوب و لكني أريد أعادة أرسال أمر أخر بنفس الطريقة مدام yourPro.StartInfo لسه شغال المفروض أنه يرسل أي عدد من الأوامر و السؤال هو , كيف ؟؟؟
هذا الموضوع مغلق.