C # بروسيس ويتفوريكسيت ستاندارد أوتبوت
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
process. start: كيفية الحصول على الإخراج؟
أود تشغيل برنامج سطر الأوامر الخارجية من بلدي مونو / التطبيق. على سبيل المثال، أود أن تشغيل مينكودر. هل هو ممكن:
للحصول على إخراج سطر الأوامر قذيفة، والكتابة على مربع النص الخاص بي؟ للحصول على القيمة العددية لإظهار شريط التقدم مع مرور الوقت المنقضي؟
عند إنشاء كائن بروسيس تعيين ستارتينفو بشكل مناسب:
ثم بدء العملية وقراءتها منه:
يمكنك استخدام int. Parse () أو int. TryParse () لتحويل السلاسل إلى قيم رقمية. قد تحتاج إلى القيام ببعض التلاعب بالسلسلة أولا إذا كانت هناك أحرف رقمية غير صالحة في السلاسل التي تقرأها.
يمكنك معالجة الإخراج بشكل متزامن أو بشكل غير متزامن.
لاحظ أنه من الأفضل معالجة كل من الإخراج والأخطاء: يجب التعامل معها بشكل منفصل.
(*) بالنسبة لبعض الأوامر (هنا StartInfo. Arguments) يجب إضافة التوجيه / c، وإلا يتم تجميد العملية في ويتفوريكسيت ().
إذا كنت لا تحتاج إلى القيام بعمليات معقدة مع الإخراج، يمكنك تجاوز أسلوب أوتبوتهاندلر، فقط إضافة معالجات مباشرة مضمنة:
الطريقة المعيارية للقيام بذلك هي القراءة من عملية "ستانداردوتبوت تيار. هناك مثال في مستندات مسن المرتبطة. مماثلة، يمكنك أن تقرأ من ستانداردرور، والكتابة إلى ستانداردينبوت.
حسنا، لكل من يريد كل من الأخطاء والمخرجات قراءة، ولكن يحصل ديادلوكس مع أي من الحلول، المنصوص عليها في إجابات أخرى (مثلي)، وهنا هو الحل الذي بنيت بعد قراءة شرح مسن لخاصية ستانداردوتبوت.
الإجابة مبنية على كود T30:
يمكنك استخدام الذاكرة المشتركة للعمليات 2 للاتصال من خلال، تحقق من ميموريماببدفيل.
فسوف تقوم أساسا بإنشاء ملف ملف الذاكرة مف في العملية الأصل باستخدام عبارة "استخدام" ثم إنشاء العملية الثانية حتى ينتهي والسماح لها كتابة النتيجة إلى مف باستخدام بيناريوريتر ثم قراءة النتيجة من مف باستخدام العملية الأم ، يمكنك أيضا تمرير اسم مف باستخدام وسيطات سطر الأوامر أو التعليمات البرمجية الثابت ذلك.
تأكد عند استخدام الملف المعين في العملية الأصل التي تقوم بها عملية الطفل كتابة النتيجة إلى الملف المعين قبل أن يتم تحرير الملف المعين في العملية الأصل.
مثال: عملية الأصل.
لاستخدام هذه العينة، ستحتاج إلى إنشاء حل مع 2 مشاريع داخل، ثم يمكنك اتخاذ نتيجة بناء لعملية الطفل من٪ تشيلدير٪ / بن / التصحيح ونسخه إلى٪ بارينتدركتوري٪ / بن / ديبوغ ثم قم بتشغيل المشروع الأم.
تشيلدير و بارنتدركتوري هي أسماء المجلدات من المشاريع الخاصة بك على جهاز الكمبيوتر حظا سعيدا :)
هذا يعتمد على مينكودر. إذا كان يلغي هذه الحالة على سطر الأوامر ثم نعم :)
مثال الاستخدام.
أنا حلها بهذه الطريقة:
أنا إعادة توجيه كل من المدخلات والمخرجات والخطأ وتناولت القراءة من الإخراج وتدفقات الخطأ. يعمل هذا الحل ل سك 7-8، سواء بالنسبة ويندوز 7 و ويندوز 8.
حاولت جعل الطبقة التي من شأنها حل مشكلتك باستخدام تيار غير متزامن قراءة، من خلال اتخاذ في حساب علامة بييرز، روب، ستيفيفاي الأجوبة. القيام بذلك أدركت أن هناك خلل المتعلقة غير متزامن الناتج إخراج تيار قراءة.
لا يمكنك القيام بذلك:
سوف تتلقى System. InvalidOperationException: لم تتم إعادة توجيه ستانداردوت أو لم تبدأ العملية حتى الآن.
ثم لديك لبدء إخراج غير متزامن قراءة بعد بدء العملية:
القيام بذلك، جعل حالة سباق لأن تيار الإخراج يمكن أن تتلقى البيانات قبل تعيينه إلى غير متزامن:
ثم بعض الناس يمكن أن أقول أن لديك فقط لقراءة تيار قبل تعيينه إلى غير متزامن. ولكن نفس المشكلة تحدث. سيكون هناك حالة سباق بين قراءة متزامن وتعيين تيار في وضع غير متزامن.
لا توجد طريقة للحصول على قراءة غير متزامنة آمنة من تيار الإخراج من عملية في الطريقة الفعلية "عملية" و "بروسيسستارتينفو" تم تصميم.
ربما كنت أفضل باستخدام قراءة غير متزامن مثل اقترح من قبل المستخدمين الآخرين لحالتك. ولكن يجب أن تكون على علم بأنك يمكن أن تفوت بعض المعلومات بسبب حالة السباق.
أي من الإجابات أعلاه هو القيام بهذه المهمة.
الحل روب معلقة وحل "مارك بييرز 'الحصول على استثناء التخلص منها. (حاولت" حلول "من الإجابات الأخرى).
لذلك قررت أن أقترح حل آخر:
هذا رمز تصحيحها ويعمل تماما.
أنا شيء أن هذا هو نهج بسيط وأفضل (نحن لسنا بحاجة أوتوريزيتيفنت):
كنت تواجه نفس المشكلة، ولكن السبب كان مختلفا. ومع ذلك فإنه يحدث تحت ويندوز 8، ولكن ليس تحت ويندوز 7. يبدو أن السطر التالي قد تسبب في المشكلة.
كان الحل عدم تعطيل وسشليكسكيوت. تلقيت الآن نافذة منبثقة شل، غير المرغوب فيها، ولكن أفضل بكثير من البرنامج في انتظار لا شيء معين أن يحدث. لذلك أضفت العمل التالي حول ذلك:
الآن الشيء الوحيد الذي يزعجني هو لماذا يحدث هذا تحت ويندوز 8 في المقام الأول.
المقدمة.
الإجابة المقبولة حاليا لا تعمل (يلقي استثناء) وهناك الكثير من الحلول ولكن لا يوجد رمز كامل. ومن الواضح أن هذا يضيع الكثير من الوقت الناس لأن هذا هو السؤال الشعبي.
الجمع بين إجابة مارك بييرز وإجابة كارول تيل كتبت الكود الكامل على أساس كيف أريد استخدام الأسلوب Process. Start.
لقد استخدمته لإنشاء الحوار التقدم حول أوامر جيت. هذه هي الطريقة التي استخدمتها:
من الناحية النظرية يمكنك أيضا الجمع بين ستدوت وستدير، ولكن لم اختبر ذلك.
وأنا أعلم أن هذا العشاء القديم ولكن بعد قراءة هذه الصفحة بأكملها لا شيء من الحلول كان يعمل بالنسبة لي، على الرغم من أنني لم أحاول محمد ريحان كما كان من الصعب قليلا على رمز لمتابعة، على الرغم من أنني أعتقد أنه كان على الطريق الصحيح . عندما أقول أنها لم تعمل هذا ليس صحيحا تماما، وأحيانا أنها سوف تعمل بشكل جيد، وأعتقد أنه هو شيء للقيام به مع طول الإخراج قبل علامة إوف.
على أي حال، كان الحل الذي عملت بالنسبة لي لاستخدام المواضيع المختلفة لقراءة ستانداردوتبوت و ستانداردرور وكتابة الرسائل.
نأمل أن يساعد هذا الشخص، الذي يعتقد أن هذا يمكن أن يكون من الصعب جدا!
الحلول الأخرى (بما في ذلك EM0 في) لا يزال مسدودا لتطبيقي، بسبب مهلات الداخلية واستخدام كل من ستانداردوتبوت و ستانداردرور من تطبيق ولدت. هنا هو ما عمل لي:
تحرير: إضافة التهيئة من ستارتينفو إلى نموذج التعليمات البرمجية.
هذه الوظيفة ربما عفا عليها الزمن ولكن اكتشفت السبب الرئيسي لماذا عادة تعليق هو بسبب تجاوز كومة ل ريديريكتستانداردوتبوت أو إذا كان لديك ريديريكتستانداردورور.
كما بيانات الإخراج أو بيانات الخطأ كبيرة، وسوف يسبب وقت تعليق لأنه لا يزال يعالج لمدة غير محددة.
C # بروسيس ويتفوريكسيت ستاندارد أوتبوت
هناك خلل في التعليمات البرمجية التالية في البرنامج الخاص بك:
إذا حاولت عملية الطفل الكتابة أكثر إلى ستدوت و / أو ستدر من سوف تناسب في أوتبوتريدر و / أو إرورريدر، ثم سيتم تعليق حتى يقرأ البرنامج بعض من هذا الإخراج. ولكن برنامجك ينتظر حتى يتم الانتهاء من العملية قبل أن يقرأ أي شيء. بحيث يكون لديك طريق مسدود.
بلدي جافا هو صدئ، وكنت أبحث عن إجابة لمشكلة مختلفة، لكنه يحدث لي ربما ربما التعليق التالي من.
قد تكون ذات صلة بمشكلتك:
لقد قمت بتحميل المصدر وتجميعه مباشرة دون تعديل التعليمات البرمجية وإطلاق لاختبار ويبدو العمل بشكل جيد ولكن لبعض التنفيذ فقط.
قلت فقط لأنني وضعت تطبيق في العام الماضي لإخراج أدوات إلغاء التجزئة من أوسلجيكش اسمه "cdefrag. exe" والإخراج أبدا الحصول تماما، والمشكلة مع التطبيق الخاص بك هو بالضبط نفس الشيء.
أواجه نفس المشكلة كما العديد من هنا: مثل استخدام ftp. exe أو أي إيكس ثنائي الاتجاه شل.
أنا باستخدام plink. exe: أحتاج في مربع النص للحصول على الإخراج في الوقت الحقيقي: ليس فقط "outputreader. readtoend".
بالطبع أنا إزالة "عملية ويتفور الخروج". حاولت وضع ريادلين بدلا من ريادتويند. ولكن مع أي حظ. حتى حاولت بعض "بينما" حلقة.
أنا، ونحن في المنتدى بحاجة إلى ما يلي:
1- لا يتم عرض نافذة وحدة التحكم.
2- أن تكون قادرا على رؤية في الوقت الحقيقي، هذا الخط عن طريق خط ما إجابة الأمر هو (إكستبل فتب سدف @ سدف سوف نسأل عن كلمة المرور، ونحن بحاجة إلى أن نرى أن في المربع، لا تنتظر ftp. exe أن يكون توقف يدويا ثم عرض الإخراج ".
وأنا أعلم أن هذا ممكن، وهو رجل جعلت سكوريتونل برنامج صغير مجاني في دلفي التي قبض على إخراج قذيفة إيكس وطباعته في الوقت الحقيقي في مربع النص، وبالتالي فإن البرنامج قادر على الاستجابة مع المدخلات في الوقت المناسب (مثل متى قذيفة تطلب كلمة مرور،).
أي فكرة كيف نفعل ذلك؟
أنا المنفذة من كمد هو أوبنفن --config client. ovpn --ca certificate. cer --auth-وسر-باس user. txt.
أنا لا أريد أن تمرير ملف user. txt وأدخل اسم المستخدم وكلمة المرور من التطبيق. لقد تعاملت بالفعل مع الانتاج باستخدام معالج. في إد عندما يريد المستخدم للخروج، أريد أن أدخل F4 وهذا هو المفتاح للخروج أوبنفن نظيفة.
لست قادرا على معرفة كيفية التعامل مع المدخلات والمخرجات على حد سواء في نفس الوقت. أعتقد أنني أيضا بحاجة إلى اختبار في معالج الانتاج للنص مثل "أدخل اسم إيسرنام:" ثم تمرير اسم المستخدم عبر سوريتر.
بروسسينفو = نيو بروسيسستارتينفو ("cmd. exe"، "/ C" + الأمر)؛
سب = نيو سترينغبيلدر ()؛
process. OutputDataReceived + = جديد داتاريسيفديفاندلر (Process_OutputDataReceived)؛
أريد أن الأنابيب المدخلات إلى ملف إيكس دون استخدام الملف الفعلي. للقيام بنفس الأمر التالي: اكتب blabla. txt | abc. exe. مثلا محتويات blabla. txt هو بالفعل في متغير وأريد أن تمرير محتويات المتغير إلى abc. exe.
شكرا مقدما على إجابتك.
أدخل اسمك: مينام.
اسمك هو: مينام.
أدخل اسمك: اسمك:
ps. StartInfo. FileName = "& لوت؛ ماي إيكس نيم & غ؛"
ps. StartInfo. Arguments = "& لوت؛ وسيط سطر الأوامر & غ؛"
ديم ست أس نيو System. Text. StringBuilder (sr_Ps. ReadToEnd ())
إكس c: \ abc. txt & لوت؛ xyz. txt.
كيف أقوم بذلك.
أنا بحاجة إلى إعادة توجيه محتويات ملف واحد إلى التطبيق إيكس.
وهذا قد يساعدك.
لسبب ما هو معلق على قراءة معيار الإدخال.
يمكن لأي شخص شرح لي لماذا.
لماذا يفعل ذلك، أنا لا أعرف. ومع ذلك، ولكن إذا كان أي شخص لديه الفكر على اصطياد خط موجه عند العملية الخاصة بك هو انتظار المدخلات، وسأكون سعيدا لسماع ذلك.
هناك 10 أنواع من الناس في العالم.
أولئك الذين يفهمون ثنائي وأولئك الذين لا.
في بلدي التطبيق، ولست بحاجة لمحاكاة المدخلات القياسية مع المعلمات المأخوذة من رمز C #.
كيف أقوم بذلك؟
Web03 | 2.8.171231.1 | آخر تحديث 27 أبريل 2007.
كل شيء آخر كوبيرايت & كوبي؛ كوديبروجيكت، 1999-2017.
لوسيان 'فبلوغ لوسيان & # 039؛ ق فبلوغ.
في بعض الأحيان كنت ترغب في إطلاق أداة خارجية وإرسال المدخلات إليها، وأيضا التقاط انتاجها. ولكن من السهل أن تصل إلى طريق مسدود بهذه الطريقة.
باستخدام p كما الجديد System. Diagnostics. Process.
p. StandardInput. Write ("وورد" & أمب؛ فكرلف & أمب؛ "هيلو")
"الجمود هنا إذا p يحتاج إلى كتابة أكثر من 12K ل ستانداردوتبوت.
ديم أوب = p. StandardOutput. ReadToEnd ()
Console. WriteLine ("أوتبوت:"): Console. WriteLine (المرجع)
وينشأ المأزق في هذه الحالة لأن "القط" (أداة يونكس القياسية) يقرأ أولا من ستانداردينبوت، ثم يكتب إلى ستانداردوتبوت، ثم يقرأ مرة أخرى، وهلم جرا حتى لا يبقى شيء للقراءة. ولكن إذا يملأ ستاندردوتبوت مع لا أحد لقراءته، ثم لا يمكن كتابة أي أكثر، وكتل.
عدد "12K" هو تعسفي وأنا لن تعتمد على ذلك.
باستخدام p كما الجديد System. Diagnostics. Process.
"الجمود هنا إذا p يحتاج إلى كتابة أكثر من 12K ل ستانداردرور.
ديم أوب = p. StandardOutput. ReadToEnd ()
ديم إر = p. StandardError. ReadToEnd ()
Console. WriteLine ("أوتبوت:"): Console. WriteLine (المرجع)
Console. WriteLine ("إرور:"): Console. WriteLine (إر)
تقول وثائق مسن "يمكنك استخدام عمليات القراءة غير متزامنة لتجنب هذه التبعيات وإمكانية توقف تام. وبالتالي يمكنك تجنب حالة توقف تام عن طريق إنشاء مؤشرات الترابط وقراءة إخراج كل تيار على مؤشر ترابط منفصل". لذلك هذا ما نحن 'سافعل.
استخدام المواضيع لإعادة التوجيه دون توقف تام.
'كود جيد: هذا لن الجمود.
باستخدام p كما Diagnostics. Process جديد.
'لا ويتفوريكسيت بعد ذلك من شأنه أن يعرض ديادلوكس.
p. InputAndOutputToEnd ("وورد" & أمب؛ فكرلف & أمب؛ "هيلو"، المرجع السابق، لا شيء)
Console. WriteLine ("أوتبوت:"): Console. WriteLine (المرجع)
'' 'إنبوتاندوتوتبويند: طريقة سهلة لاستخدام إعادة توجيه الإدخال / الإخراج / خطأ على ص.
'' '& لوت؛ بارام نيم = "p" & غ؛ p p ريديريكت. يجب تعيين وسشليكسكيوت على فالس. & لوت؛ / بارام & غ؛
'' '& لوت؛ بارام نيم = "ستانداردينبوت" & غ؛ سيتم إرسال هذه السلسلة كإدخال إلى صفحة p. (يجب ألا يكون هناك شيء إن لم يكن StartInfo. RedirectStandardInput) & لوت؛ / بارام & غ؛
'' '& لوت؛ بارام نيم = "ستانداردوتبوت" & غ؛ سيتم جمع إخراج p في سلسلة بيريف هذه. (يجب ألا يكون هناك شيء إن لم يكن StartInfo. RedirectStandardOutput) & لوت؛ / بارام & غ؛
'' '& لوت؛ بارام نيم = "ستاندارديرور" & غ؛ سيتم جمع خطأ p في سلسلة بيريف هذه. (يجب أن يكون لا شيء إن لم يكن StartInfo. RedirectStandardError) & لوت؛ / بارام & غ؛
'' '& لوت؛ ريماركس & غ؛ هذه الوظيفة تحل مشكلة الجمود المذكورة في msdn. microsoft/en-us/library/system. diagnostics. p.standardoutput. aspx<؛/remarks>؛
العلامة & lt؛ RuntimepilerServices. Extension () & GT. سوب إنبوت أند أوتبوتيند (بيفال p أس Diagnostics. Process، بيفال ستانداردبوت أس سترينغ، بيريف ستانداردوتبوت أس سترينغ، بيريف ستانداردورور أس سترينغ)
إذا p هو لا شيء ثم رمي نيو أرغمنتكسيبتيون ("p يجب أن يكون غير فارغ")
'افترض p قد بدأت. للأسف ليس هناك طريقة للتحقق.
إذا p. StartInfo. UseShellExecute ثم رمي نيو أرغمنتكسيبتيون ("تعيين StartInfo. UseShellExecute إلى فالس")
إذا كان (p. StartInfo. RedirectStandardInput & لوت؛ & غ؛ (ستانداردينبوت إيسنوت نوثينغ)) ثم رمي نيو أرغمنتكسيبتيون ("تقديم إدخال غير فارغ فقط عند StartInfo. RedirectStandardInput")
إذا كان (p. StartInfo. RedirectStandardOutput & لوت؛ & غ؛ (ستانداردوتبوت إسنوت نوثينغ)) ثم رمي نيو أرغمنتكسيبتيون ("تقديم إخراج غير فارغ فقط عند StartInfo. RedirectStandardOutput")
إذا كان (p. StartInfo. RedirectStandardError & لوت؛ & غ؛ (ستاندارديرور إسنوت نوثينغ)) ثم رمي نيو أرغمنتكسيبتيون ("تقديم خطأ غير فارغ فقط عند StartInfo. RedirectStandardError")
ديم أوتبوتداتا كما إنبوتاندوتبوتونداتا جديد.
ديم إرورداتا كما جديد إنبوتاندوتوتبوانداتا.
إذا كان p. StartInfo. RedirectStandardOutput ثم.
outputData. Thread = نيو Threading. Thread (أدرسوف إنبوتاندوتوتبوندبروك)
إذا p. StartInfo. RedirectStandardError ثم.
errorData. Thread = نيو Threading. Thread (أدرسوف إنبوتاندوتوتبوندبروك)
إذا كان p. StartInfo. RedirectStandardInput ثم.
إذا p. StartInfo. RedirectStandardOutput ثم outputData. Thread. Join (): ستانداردوتبوت = outputData. Output.
إذا p. StartInfo. RedirectStandardError ثم errorData. Thread. Join (): ستاندارديرور = errorData. Output.
إذا outputData. Exception إيسنوت لا شيء ثم رمي outputData. Exception.
إذا errorData. Exception إيسنوت لا شيء ثم رمي errorData. Exception.
مدخلات الفئة الخاصة أندبوتونداتا.
الموضوع العام كما Threading. Thread.
تيار عام كما IO. StreamReader.
الإخراج العام كسلسلة.
استثناء عام كاستثناء.
بريفات سوب إنبوتاندوتوتبوندبروك (بيفال data_ أس أوبجيكت)
ديم داتا = ديركتكاست (data_، إنبوتاندوتوتبوتنداتا)
جرب: data. Output = data. Stream. ReadToEnd: كاتش e كاستثناء: data. Exception = e: إند تري.
إلغاء الرد.
لماذا لا تستخدم process. OutputDataReceived أند process. ErrorDataReceived؟
وبهذه الطريقة يمكنك صدى (أو التقاط) الإخراج من كل من في الترتيب وردت.
هذا يبدو أبسط بكثير من غير المتشابكة أو خيوط لي.
C # بروسيس ويتفوريكسيت ستاندارد أوتبوت
في منشئ بروسيسكالر الخاص بك كنت تمرير النموذج (هذا) كهدف.
ماذا لو كانت الدالة ستاربروسيس ليست في شكل ما يجب أن تمرير في منشئ؟
أنا إنقاذ ستدوتبوت إلى ملف نصي.
شكرا على رمز !! حفظ لي قليلا من الوقت لأن هذا كان بالضبط الطريقة كنت تخطط للقيام بهذه السيطرة.
2. الدالة المصدرة الوحيدة "تنفيذ" في هذا دل يستخدم نفس الاستدعاء الدعوة كافة ويندوز دلز. (وينابي = __stdcall)
3. يمكنك استخدام دل في أي مترجم لأي لغة البرمجة التي تدعم المكالمات أبي. (إذا كان يمكنك استدعاء Kernel32.dll، يمكنك أيضا استدعاء CaptureConsole. dll)
4. هذا التحميل يحتوي على تطبيق تجريبي ل C ++، فيسوال باسيك 6، ف و C # التي تثبت كيفية تحميل دل واستدعاء وظيفة "تنفيذ".
5. دل هو مؤشر ترابط آمن: يمكنك تنفيذ تطبيقات وحدة تحكم متعددة في نفس الوقت من المواضيع المختلفة.
6. يمكنك اختيار إذا كنت تريد ستدوت و ستدير فصل أو كما مختلطة الإخراج.
7. يتم إرجاع رمز الخروج من تطبيق وحدة التحكم إلى المتصل.
8. يمكنك تعريف دليل العمل (جيتكورنتدركتوري) لتطبيق وحدة التحكم.
9. يمكنك تمرير متغيرات بيئة إضافية (جيتينفيرونفاريابل) إلى تطبيق وحدة التحكم أو استبدال تلك الموجودة.
10. يمكن تجميع دل كما ونيكود (الصادرات إكسكوتو) أو أنسي (تصدير إكسكوتيا).
11. دل هو مشروع مفك C ++، ولكن لا يتطلب MFCxx. DLL خارجي لأن مفك مرتبط بشكل ثابت. (CaptureConsole. DLL يعتمد فقط على دلز ويندوز القياسية)
12. يستخدم دل داخليا كسترينغس والصادرات بستر، لذلك تجاوز المخزن المؤقت هو مستحيل. إذا كانت وحدة التحكم الخاصة بك تطبع إخراج النص 50 ميغابايت، وهذا لا توجد مشكلة.
13. يتم التعامل مع جميع أخطاء واجهة برمجة التطبيقات التي قد تحدث أثناء بدء عملية وحدة التحكم ويتم إرجاعها كرسالة خطأ قابلة للقراءة البشرية.
14. يمكنك تحديد مهلة اختيارية. إذا انقضت، سيتم قتل عملية وحدة التحكم. هذا يتجنب العمليات الميتة معلقة عند استخدامها على الخادم.
15. يتم تحويل الأحرف الخاصة (مثل نووليو) إلى دوس كوديباج عند تمريرها كمعلمات سطر الأوامر.
16. يتم تحويل الأحرف الخاصة مرة أخرى إلى كوديباج أنسي عند إرجاعها إلى تطبيق الاتصال.
لدي قضية واحدة التي لا يمكن حلها - كيف يمكنني تعليق موضوع؟
على سبيل المثال في عينتك إذا كنا نود لإضافة زر الذي سوف وقفة الطباعة واستئناف ذلك مع زر آخر فوق. كيف يمكن أن تتم؟
أنا لا أعرف إذا كان هذا الموضوع لا يزال مفتوحا ولكن لدي بعض الأسئلة.
كيف يمكنك إنهاء العملية على الفور قراءة خطأ قياسي؟
أنا أحاول تعديل التعليمات البرمجية لتنفيذ ملف دفعي يحتوي على بعض الأوامر ولكن أريد إنهاء العملية في أي وقت يتم مواجهة ستدر.
سوف نقدر بعض المساعدة.
مع التطبيق التجريبي الذي يكتب إلى وحدة التحكم (SmallConsoleProgram. exe) كل يعمل بشكل جيد.
مبلكس هو المضاعف الذي تعدد ملفات مبيغ من ملفات الفيديو والصوت منفصلة.
مبيلكس يكتب كل انتاجها إلى وحدة التحكم.
مباشرة بعد بدء ملبكس فإنه يكتب السطر الأول من الإخراج إلى مربع دوس، وهو دائما هذا:
يبقى مربع النص فارغا طوال الوقت.
ليس قبل عملية مبلكس خرجت كل الإخراج يظهر في وقت واحد!
إذا وجدت مشروع آخر الذي يفعل الشيء نفسه ولكن كتب في C ++.
كما يعرض الإخراج بعد الانتهاء مبيلكس!
ولكن لدي أخبار سيئة لجميع أولئك الذين لديهم نفس المشكلة:
فإنه لا يمكن حتى إعادة توجيه إخراج وحدة التحكم من تطبيقات C ++!
بدلا من قبول علة في مسن يجب أن تكون قد حلت المشكلة بدلا من ذلك!
مقالة قاعدة المعارف هي من عام 2003!
يجب أن يكون هناك تدفق السيارات بعد كل سطر الذي تم طباعته، ثم جميع تطبيقات وحدة التحكم يمكن رصدها!
Web01 | 2.8.171231.1 | آخر تحديث 1 سبتمبر 2003.
كل شيء آخر كوبيرايت & كوبي؛ كوديبروجيكت، 1999-2017.
هناك خلل في التعليمات البرمجية التالية في البرنامج الخاص بك:
إذا حاولت عملية الطفل الكتابة أكثر إلى ستدوت و / أو ستدر من سوف تناسب في أوتبوتريدر و / أو إرورريدر، ثم سيتم تعليق حتى يقرأ البرنامج بعض من هذا الإخراج. ولكن برنامجك ينتظر حتى يتم الانتهاء من العملية قبل أن يقرأ أي شيء. بحيث يكون لديك طريق مسدود.
بلدي جافا هو صدئ، وكنت أبحث عن إجابة لمشكلة مختلفة، لكنه يحدث لي ربما ربما التعليق التالي من.
قد تكون ذات صلة بمشكلتك:
لقد قمت بتحميل المصدر وتجميعه مباشرة دون تعديل التعليمات البرمجية وإطلاق لاختبار ويبدو العمل بشكل جيد ولكن لبعض التنفيذ فقط.
قلت فقط لأنني وضعت تطبيق في العام الماضي لإخراج أدوات إلغاء التجزئة من أوسلجيكش اسمه "cdefrag. exe" والإخراج أبدا الحصول تماما، والمشكلة مع التطبيق الخاص بك هو بالضبط نفس الشيء.
أواجه نفس المشكلة كما العديد من هنا: مثل استخدام ftp. exe أو أي إيكس ثنائي الاتجاه شل.
أنا باستخدام plink. exe: أحتاج في مربع النص للحصول على الإخراج في الوقت الحقيقي: ليس فقط "outputreader. readtoend".
بالطبع أنا إزالة "عملية ويتفور الخروج". حاولت وضع ريادلين بدلا من ريادتويند. ولكن مع أي حظ. حتى حاولت بعض "بينما" حلقة.
أنا، ونحن في المنتدى بحاجة إلى ما يلي:
1- لا يتم عرض نافذة وحدة التحكم.
2- أن تكون قادرا على رؤية في الوقت الحقيقي، هذا الخط عن طريق خط ما إجابة الأمر هو (إكستبل فتب سدف @ سدف سوف نسأل عن كلمة المرور، ونحن بحاجة إلى أن نرى أن في المربع، لا تنتظر ftp. exe أن يكون توقف يدويا ثم عرض الإخراج ".
وأنا أعلم أن هذا ممكن، وهو رجل جعلت سكوريتونل برنامج صغير مجاني في دلفي التي قبض على إخراج قذيفة إيكس وطباعته في الوقت الحقيقي في مربع النص، وبالتالي فإن البرنامج قادر على الاستجابة مع المدخلات في الوقت المناسب (مثل متى قذيفة تطلب كلمة مرور،).
أي فكرة كيف نفعل ذلك؟
أنا المنفذة من كمد هو أوبنفن --config client. ovpn --ca certificate. cer --auth-وسر-باس user. txt.
أنا لا أريد أن تمرير ملف user. txt وأدخل اسم المستخدم وكلمة المرور من التطبيق. لقد تعاملت بالفعل مع الانتاج باستخدام معالج. في إد عندما يريد المستخدم للخروج، أريد أن أدخل F4 وهذا هو المفتاح للخروج أوبنفن نظيفة.
لست قادرا على معرفة كيفية التعامل مع المدخلات والمخرجات على حد سواء في نفس الوقت. أعتقد أنني أيضا بحاجة إلى اختبار في معالج الانتاج للنص مثل "أدخل اسم إيسرنام:" ثم تمرير اسم المستخدم عبر سوريتر.
بروسسينفو = نيو بروسيسستارتينفو ("cmd. exe"، "/ C" + الأمر)؛
سب = نيو سترينغبيلدر ()؛
process. OutputDataReceived + = جديد داتاريسيفديفاندلر (Process_OutputDataReceived)؛
أريد أن الأنابيب المدخلات إلى ملف إيكس دون استخدام الملف الفعلي. للقيام بنفس الأمر التالي: اكتب blabla. txt | abc. exe. مثلا محتويات blabla. txt هو بالفعل في متغير وأريد أن تمرير محتويات المتغير إلى abc. exe.
شكرا مقدما على إجابتك.
أدخل اسمك: مينام.
اسمك هو: مينام.
أدخل اسمك: اسمك:
ps. StartInfo. FileName = "& لوت؛ ماي إيكس نيم & غ؛"
ps. StartInfo. Arguments = "& لوت؛ وسيط سطر الأوامر & غ؛"
ديم ست أس نيو System. Text. StringBuilder (sr_Ps. ReadToEnd ())
إكس c: \ abc. txt & لوت؛ xyz. txt.
كيف أقوم بذلك.
أنا بحاجة إلى إعادة توجيه محتويات ملف واحد إلى التطبيق إيكس.
وهذا قد يساعدك.
لسبب ما هو معلق على قراءة معيار الإدخال.
يمكن لأي شخص شرح لي لماذا.
لماذا يفعل ذلك، أنا لا أعرف. ومع ذلك، ولكن إذا كان أي شخص لديه الفكر على اصطياد خط موجه عند العملية الخاصة بك هو انتظار المدخلات، وسأكون سعيدا لسماع ذلك.
هناك 10 أنواع من الناس في العالم.
أولئك الذين يفهمون ثنائي وأولئك الذين لا.
في بلدي التطبيق، ولست بحاجة لمحاكاة المدخلات القياسية مع المعلمات المأخوذة من رمز C #.
كيف أقوم بذلك؟
Web03 | 2.8.171231.1 | آخر تحديث 27 أبريل 2007.
كل شيء آخر كوبيرايت & كوبي؛ كوديبروجيكت، 1999-2017.
لوسيان 'فبلوغ لوسيان & # 039؛ ق فبلوغ.
في بعض الأحيان كنت ترغب في إطلاق أداة خارجية وإرسال المدخلات إليها، وأيضا التقاط انتاجها. ولكن من السهل أن تصل إلى طريق مسدود بهذه الطريقة.
باستخدام p كما الجديد System. Diagnostics. Process.
p. StandardInput. Write ("وورد" & أمب؛ فكرلف & أمب؛ "هيلو")
"الجمود هنا إذا p يحتاج إلى كتابة أكثر من 12K ل ستانداردوتبوت.
ديم أوب = p. StandardOutput. ReadToEnd ()
Console. WriteLine ("أوتبوت:"): Console. WriteLine (المرجع)
وينشأ المأزق في هذه الحالة لأن "القط" (أداة يونكس القياسية) يقرأ أولا من ستانداردينبوت، ثم يكتب إلى ستانداردوتبوت، ثم يقرأ مرة أخرى، وهلم جرا حتى لا يبقى شيء للقراءة. ولكن إذا يملأ ستاندردوتبوت مع لا أحد لقراءته، ثم لا يمكن كتابة أي أكثر، وكتل.
عدد "12K" هو تعسفي وأنا لن تعتمد على ذلك.
باستخدام p كما الجديد System. Diagnostics. Process.
"الجمود هنا إذا p يحتاج إلى كتابة أكثر من 12K ل ستانداردرور.
ديم أوب = p. StandardOutput. ReadToEnd ()
ديم إر = p. StandardError. ReadToEnd ()
Console. WriteLine ("أوتبوت:"): Console. WriteLine (المرجع)
Console. WriteLine ("إرور:"): Console. WriteLine (إر)
تقول وثائق مسن "يمكنك استخدام عمليات القراءة غير متزامنة لتجنب هذه التبعيات وإمكانية توقف تام. وبالتالي يمكنك تجنب حالة توقف تام عن طريق إنشاء مؤشرات الترابط وقراءة إخراج كل تيار على مؤشر ترابط منفصل". لذلك هذا ما نحن 'سافعل.
استخدام المواضيع لإعادة التوجيه دون توقف تام.
'كود جيد: هذا لن الجمود.
باستخدام p كما Diagnostics. Process جديد.
'لا ويتفوريكسيت بعد ذلك من شأنه أن يعرض ديادلوكس.
p. InputAndOutputToEnd ("وورد" & أمب؛ فكرلف & أمب؛ "هيلو"، المرجع السابق، لا شيء)
Console. WriteLine ("أوتبوت:"): Console. WriteLine (المرجع)
'' 'إنبوتاندوتوتبويند: طريقة سهلة لاستخدام إعادة توجيه الإدخال / الإخراج / خطأ على ص.
'' '& لوت؛ بارام نيم = "p" & غ؛ p p ريديريكت. يجب تعيين وسشليكسكيوت على فالس. & لوت؛ / بارام & غ؛
'' '& لوت؛ بارام نيم = "ستانداردينبوت" & غ؛ سيتم إرسال هذه السلسلة كإدخال إلى صفحة p. (يجب ألا يكون هناك شيء إن لم يكن StartInfo. RedirectStandardInput) & لوت؛ / بارام & غ؛
'' '& لوت؛ بارام نيم = "ستانداردوتبوت" & غ؛ سيتم جمع إخراج p في سلسلة بيريف هذه. (يجب ألا يكون هناك شيء إن لم يكن StartInfo. RedirectStandardOutput) & لوت؛ / بارام & غ؛
'' '& لوت؛ بارام نيم = "ستاندارديرور" & غ؛ سيتم جمع خطأ p في سلسلة بيريف هذه. (يجب أن يكون لا شيء إن لم يكن StartInfo. RedirectStandardError) & لوت؛ / بارام & غ؛
'' '& لوت؛ ريماركس & غ؛ هذه الوظيفة تحل مشكلة الجمود المذكورة في msdn. microsoft/en-us/library/system. diagnostics. p.standardoutput. aspx<؛/remarks>؛
العلامة & lt؛ RuntimepilerServices. Extension () & GT. سوب إنبوت أند أوتبوتيند (بيفال p أس Diagnostics. Process، بيفال ستانداردبوت أس سترينغ، بيريف ستانداردوتبوت أس سترينغ، بيريف ستانداردورور أس سترينغ)
إذا p هو لا شيء ثم رمي نيو أرغمنتكسيبتيون ("p يجب أن يكون غير فارغ")
'افترض p قد بدأت. للأسف ليس هناك طريقة للتحقق.
إذا p. StartInfo. UseShellExecute ثم رمي نيو أرغمنتكسيبتيون ("تعيين StartInfo. UseShellExecute إلى فالس")
إذا كان (p. StartInfo. RedirectStandardInput & لوت؛ & غ؛ (ستانداردينبوت إيسنوت نوثينغ)) ثم رمي نيو أرغمنتكسيبتيون ("تقديم إدخال غير فارغ فقط عند StartInfo. RedirectStandardInput")
إذا كان (p. StartInfo. RedirectStandardOutput & لوت؛ & غ؛ (ستانداردوتبوت إسنوت نوثينغ)) ثم رمي نيو أرغمنتكسيبتيون ("تقديم إخراج غير فارغ فقط عند StartInfo. RedirectStandardOutput")
إذا كان (p. StartInfo. RedirectStandardError & لوت؛ & غ؛ (ستاندارديرور إسنوت نوثينغ)) ثم رمي نيو أرغمنتكسيبتيون ("تقديم خطأ غير فارغ فقط عند StartInfo. RedirectStandardError")
ديم أوتبوتداتا كما إنبوتاندوتبوتونداتا جديد.
ديم إرورداتا كما جديد إنبوتاندوتوتبوانداتا.
إذا كان p. StartInfo. RedirectStandardOutput ثم.
outputData. Thread = نيو Threading. Thread (أدرسوف إنبوتاندوتوتبوندبروك)
إذا p. StartInfo. RedirectStandardError ثم.
errorData. Thread = نيو Threading. Thread (أدرسوف إنبوتاندوتوتبوندبروك)
إذا كان p. StartInfo. RedirectStandardInput ثم.
إذا p. StartInfo. RedirectStandardOutput ثم outputData. Thread. Join (): ستانداردوتبوت = outputData. Output.
إذا p. StartInfo. RedirectStandardError ثم errorData. Thread. Join (): ستاندارديرور = errorData. Output.
إذا outputData. Exception إيسنوت لا شيء ثم رمي outputData. Exception.
إذا errorData. Exception إيسنوت لا شيء ثم رمي errorData. Exception.
مدخلات الفئة الخاصة أندبوتونداتا.
الموضوع العام كما Threading. Thread.
تيار عام كما IO. StreamReader.
الإخراج العام كسلسلة.
استثناء عام كاستثناء.
بريفات سوب إنبوتاندوتوتبوندبروك (بيفال data_ أس أوبجيكت)
ديم داتا = ديركتكاست (data_، إنبوتاندوتوتبوتنداتا)
جرب: data. Output = data. Stream. ReadToEnd: كاتش e كاستثناء: data. Exception = e: إند تري.
إلغاء الرد.
لماذا لا تستخدم process. OutputDataReceived أند process. ErrorDataReceived؟
وبهذه الطريقة يمكنك صدى (أو التقاط) الإخراج من كل من في الترتيب وردت.
هذا يبدو أبسط بكثير من غير المتشابكة أو خيوط لي.
Comments
Post a Comment