Tuesday 6 March 2018

عملية ويتفوريكسيت رمز الخروج


بروسيس ويتفوريكسيت إكسيت كود
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
الحصول على إكسيتكود باستخدام بدء العملية و ويتفوريكسيت بدلا من - Wait.
أحاول تشغيل برنامج من بويرشيل، انتظر للخروج، ثم الحصول على إكسيتكود، ولكن ليس لديها الكثير من الحظ. أنا لا أريد أن استخدام - Wait مع بدء العملية، وأنا بحاجة إلى بعض المعالجة على الاستمرار في الخلفية.
في ما يلي نص برمجي مبسط:
سيؤدي تشغيل هذا البرنامج النصي إلى بدء تشغيل المفكرة. بعد إغلاق هذا يدويا، سيتم طباعة رمز الخروج، وسوف تبدأ مرة أخرى، دون استخدام - wait. لا يتم توفير إكسيتكود عند إنهاء هذا:
أنا بحاجة إلى أن تكون قادرة على أداء معالجة إضافية بين بدء البرنامج والانتظار لإنهاء، لذلك لا أستطيع الاستفادة من - Wait. أي فكرة كيف يمكنني القيام بذلك ولا يزال الوصول إلى الخاصية. ExitCode من هذه العملية؟
أمرين يمكن أن تفعله أعتقد.
إنشاء كائن System. Diagnostics. Process يدويا وتجاوز بدء العملية تشغيل قابل للتنفيذ في مهمة الخلفية (فقط للعمليات غير التفاعلية!)
في ما يلي كيفية القيام بما يلي:
هناك أمران يجب تذكرهما هنا. واحد هو لإضافة الوسيطة - PassThru واثنان هو إضافة الوسيطة - Wait. تحتاج إلى إضافة وسيطة الانتظار بسبب هذا العيب connect. microsoft/PowerShell/feedback/details/520554/start-process-does-not-return-exitcode-property.
بمجرد القيام بذلك يتم تمرير كائن عملية مرة أخرى ويمكنك إلقاء نظرة على الخاصية إكسيتكود من هذا الكائن. هنا مثال:
إذا قمت بتشغيله دون - PassThru أو - Wait، فإنه سيتم طباعة أي شيء.
أثناء محاولة الخروج من الاقتراح النهائي أعلاه، اكتشفت حلا أبسط حتى. كل ما كان علي القيام به كان مخبأ مقبض العملية. حالما فعلت ذلك، $ process. ExitCode عملت بشكل صحيح. إذا لم أكن مخبأ مقبض العملية، كان $ process. ExitCode فارغ.
أو حاول إضافة هذا.
باستخدام هذا الرمز، لا يزال بإمكانك السماح بويرشيل رعاية إدارة إخراج / تيارات خطأ إعادة توجيه، والتي لا يمكنك القيام به باستخدام System. Diagnostics. Process. Start () مباشرة.
يبدو الخيار "-Wait" لمنع بالنسبة لي على الرغم من أن عمليتي قد انتهى.
حاولت حل أدريان وأنه يعمل. ولكنني انتظرت عملية بدلا من الاعتماد على أثر جانبي لاسترجاع مقبض العملية.

بروسيس ويتفوريكسيت إكسيت كود
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
الحصول على إكسيتكود باستخدام بدء العملية و ويتفوريكسيت بدلا من - Wait.
أحاول تشغيل برنامج من بويرشيل، انتظر للخروج، ثم الحصول على إكسيتكود، ولكن ليس لديها الكثير من الحظ. أنا لا أريد أن استخدام - Wait مع بدء العملية، وأنا بحاجة إلى بعض المعالجة على الاستمرار في الخلفية.
في ما يلي نص برمجي مبسط:
سيؤدي تشغيل هذا البرنامج النصي إلى بدء تشغيل المفكرة. بعد إغلاق هذا يدويا، سيتم طباعة رمز الخروج، وسوف تبدأ مرة أخرى، دون استخدام - wait. لا يتم توفير إكسيتكود عند إنهاء هذا:
أنا بحاجة إلى أن تكون قادرة على أداء معالجة إضافية بين بدء البرنامج والانتظار لإنهاء، لذلك لا أستطيع الاستفادة من - Wait. أي فكرة كيف يمكنني القيام بذلك ولا يزال الوصول إلى الخاصية. ExitCode من هذه العملية؟
أمرين يمكن أن تفعله أعتقد.
إنشاء كائن System. Diagnostics. Process يدويا وتجاوز بدء العملية تشغيل قابل للتنفيذ في مهمة الخلفية (فقط للعمليات غير التفاعلية!)
في ما يلي كيفية القيام بما يلي:
هناك أمران يجب تذكرهما هنا. واحد هو لإضافة الوسيطة - PassThru واثنان هو إضافة الوسيطة - Wait. تحتاج إلى إضافة وسيطة الانتظار بسبب هذا العيب connect. microsoft/PowerShell/feedback/details/520554/start-process-does-not-return-exitcode-property.
بمجرد القيام بذلك يتم تمرير كائن عملية مرة أخرى ويمكنك إلقاء نظرة على الخاصية إكسيتكود من هذا الكائن. هنا مثال:
إذا قمت بتشغيله دون - PassThru أو - Wait، فإنه سيتم طباعة أي شيء.
أثناء محاولة الخروج من الاقتراح النهائي أعلاه، اكتشفت حلا أبسط حتى. كل ما كان علي القيام به كان مخبأ مقبض العملية. حالما فعلت ذلك، $ process. ExitCode عملت بشكل صحيح. إذا لم أكن مخبأ مقبض العملية، كان $ process. ExitCode فارغ.
أو حاول إضافة هذا.
باستخدام هذا الرمز، لا يزال بإمكانك السماح بويرشيل رعاية إدارة إخراج / تيارات خطأ إعادة توجيه، والتي لا يمكنك القيام به باستخدام System. Diagnostics. Process. Start () مباشرة.
يبدو الخيار "-Wait" لمنع بالنسبة لي على الرغم من أن عمليتي قد انتهى.
حاولت حل أدريان وأنه يعمل. ولكنني انتظرت عملية بدلا من الاعتماد على أثر جانبي لاسترجاع مقبض العملية.

كود الحبيب.
مدونة للمدربين من قبل المبرمجين.
العمل مع العمليات في.
وغالبا ما يتم بناء لغات البرمجة والصدفة حول القدرة على عملية واحدة لإطلاق بسهولة والعمل مع نتائج الآخرين. هذا هو الأسلوب الأساسي للتجهيز في باش، في حين يدعم الياقوت 5 على الأقل النهج المدمج مع مستويات مختلفة من المرونة والإيجاز.
في، وهذا هو نوع من العملية يتم عادة عن طريق أبي System. Diagnostics. Process. و أبي العملية عامة جدا وقوية، ولكن يمكن أن يكون من الكعوب وصعبة الاستخدام بشكل صحيح في حالات الاستخدام الشائعة التي يتم التعامل معها بشكل جيد من قبل اللغات المذكورة أعلاه. كما المفسد، انتهى بي الأمر التفاف الكثير من هذا التعقيد في مكتبة جديدة: ميداليونشيل. مع ميداليونشيل، وهذا النوع من المهام هو بطانة واحدة:
المزيد عن ذلك في وقت لاحق، على الرغم من. في الوقت الحالي، دع & # 8217؛ نعود إلى العملية. وكمثال ملموس، أردت مؤخرا طلبي لإطلاق مثيل نوديجس من لتشغيل مترجم أقل كس. كنت بحاجة إلى الكتابة إلى عقدة & # 8217؛ s المدخلات القياسية أثناء التقاط النص الإخراج القياسية، نص الخطأ القياسية، وخروج التعليمات البرمجية.
محاولة أولية.
هنا & # 8217؛ s الشفرة التي بدأت بها:
هذا الرمز مطول تماما. للأسف انها & # 8217؛ عربات التي تجرها الدواب تماما كذلك.
التعامل مع الحجج العملية.
واحدة من المشاكل الأولى نلاحظ مع هذا الرمز هو أن الخاصية وسيطات على بروسيسستارتينفو هو مجرد سلسلة. إذا كانت الوسيطات التي نمر بها ديناميكية، فسنحتاج إلى توفير منطق الهروب المناسب قبل تسلسل لمنع أشياء مثل المسافات في مسارات الملفات من الانهيار. الهروب من سطر الأوامر ويندوز سطر الأوامر معقدة للغاية؛ لحسن الحظ، التعليمات البرمجية اللازمة لتنفيذ ذلك موثقة بشكل جيد في هذه المشاركة ستاكوفيرفلو. وبالتالي، فإن أول تغيير نحن & # 8217 سوف تجعل لإضافة المنطق الهروب:
التعامل مع ديادلوكس.
والمشكلة الأقل وضوحا هي مشكلة الجمود. جميع مسارات العملية الثلاثة (في، خارج، والخطأ) هي محدودة في مقدار المحتوى الذي يمكن عازلة. إذا كان المخزن المؤقت الداخلي يملأ، ثم كل من يكتب إلى تيار سوف كتلة. في هذه الشفرة، على سبيل المثال، لا نقرأ من تيارات الخروج والخطأ إلا بعد انتهاء العملية. وهذا يعني أننا يمكن أن نجد أنفسنا في حالة حيث العادم عوادم عليه & # 8217؛ s المخزن المؤقت الخطأ. في هذه الحالة، سوف عقدة منع على الكتابة إلى خطأ قياسي، في حين يتم حظر التطبيق لدينا القراءة إلى نهاية معيار الخروج. وهكذا، نحن & # 8217؛ وجدنا أنفسنا في طريق مسدود!
يوفر أبي العملية طريقة التي تبدو مصممة للتعامل مع هذا: بيجينوتبوت / إرورريادلين. مع هذه الطريقة، يمكنك الاشتراك في غير المتزامن & # 8220؛ داتاريفسد & # 8221؛ الأحداث بدلا من القراءة من تيارات الإخراج مباشرة. بهذه الطريقة، يمكنك الاستماع إلى كل من تيارات في وقت واحد. لسوء الحظ، هذه الطريقة لا توفر أي وسيلة لمعرفة متى تم استلام آخر بت من البيانات. لأن كل شيء غير متزامن، فمن الممكن (ولقد لاحظت هذا) للأحداث لاطلاق النار بعد عاد ويتفوريكسيت ().
لحسن الحظ، يمكننا توفير الحل البديل الخاص بنا باستخدام المهام لقراءة غير متزامنة من الجداول أثناء الانتظار لعقدة للخروج:
إضافة مهلة.
هناك مسألة أخرى نود التعامل معها وهي مسألة تعليق العملية. بدلا من الانتظار إلى الأبد لعملية الخروج، سيكون لدينا رمز أكثر قوة إذا فرضنا مهلة بدلا من ذلك:
المزامنة على طول الطريق!
بينما نستخدم الآن إو غير متزامن لقراءة من تيارات العملية، ما زلنا نحظر سلسلة ترابط واحدة أثناء انتظار إتمام العملية. يمكننا زيادة تحسين الكفاءة هنا عن طريق الذهاب غير المتزامن تماما:
التكيف مع أحجام البيانات الكبيرة.
وثمة سؤال آخر قد يطرح عند محاولة تعميم هذا النهج هو حجم البيانات. إذا كنا نقوم بتصنيع كمية كبيرة من البيانات من خلال العملية، فسنقوم على الأرجح باستبدال مكالمات ريادتوينداسينك المناسبة مع حلقات قراءة غير متزامنة تعالج كل جزء من البيانات عندما تأتي.
التبديل إلى ميداليونشيل.
لقد قمنا الآن ببناء شفرة (صحيحة) وقوية وفعالة من التعليمات البرمجية للعمل مع عملية من. ومع ذلك، نأمل أن يكون هذا المثال مقتنع لك أن أبي العملية ليست تماما حتى وظيفة عندما يتعلق الأمر سهولة الاستخدام. تحقيقا لهذه الغاية، أنا & # 8217؛ م الذهاب إلى تقديم بديل: مكتبة ميداليونشيل (متوفر على نوجيت). هنا & # 8217؛ s المنطق المكافئ باستخدام ميداليونشيل:
مع ميداليونشيل، يتم هجاء الحجج تلقائيا، يتم تلقائيا مخزنة عملية تيارات لمنع الجمود، وملفوفة كل شيء بشكل جيد في واجهة المستخدم أبي المزامنة غير ودية. نحن دون & # 8217؛ ر حتى ما يدعو للقلق حول ديسبوس (): افتراضيا يتم التخلص من العملية تلقائيا عند الانتهاء من الأمر.
كما يوفر ميداليونشيل الزائد المشغل لتمكين باش مثل إعادة توجيه المدخلات القياسية والإخراج القياسية. وهذا يعني أنه يمكنك استخدام & # 8220؛ & لوت؛ & # 8221؛ و & # 8220؛> & # 8221؛ إلى بيانات الأنابيب من وإلى الجداول والملفات والمجموعات. يمكنك حتى استخدام & # 8220؛ | & # 8221؛ إلى بيانات الأنابيب من عنصر أمر واحد إلى آخر.
مايك أديلسون.
آخر المشاركات التي كتبها مايك أديلسون (انظر جميع)
تنفيذ يساوي () و جيثاسكود () في C # 7 - 3 يونيو 2017 البرمجة في C # - 3 مايو 2017 7 طرق لاستخدام C # 7 تعبيرات رمي ​​- 26 أبريل 2017.
عن مايك أديلسون.
أنا مهندس برمجيات في أبليد بريديكتيف تيشنولوجيز في واشنطن D. C.، حيث أعمل على & # 8220؛ البيانات الكبيرة & # 8221؛ تحليلات وتطوير شبكة الإنترنت. في وقت الفراغ، وأنا أستمتع القراءة، والعمل على مختلف المشاريع الجانبية، والإجابة على الأسئلة حول ستاكوفيرفلو.
آخر الملاحة.
7 أفكار حول & لدكو؛ العمل مع العمليات في & رديقو؛
هل من الممكن القراءة والكتابة لنفس العملية من داخل نفس البرنامج. استخدمت قذيفة ميدالية لقراءة إلى الإخراج من برنامج وحدة التحكم التفاعلية. ولكن عندما أبدأ موضوع مختلف لكتابة الأوامر إلى البرنامج وريتستريم. وريتيلين يبدو فقط لشنق. أنا أحاول السيطرة على بيانوبار (انظر جيثب). هناك بعض الخطوات عند محاولة قراءة سطر من العملية والاستجابة بخط. هذا يقودني للجنون.
نعم، يجب أن يكون من الممكن القراءة والكتابة إلى عملية داخل نفس البرنامج. الرجاء التأكد من أنك تستخدم أحدث إصدار من ميداليونشيل وأنه تم تعيين الإدخال القياسي الأمر إلى أوتوفلوش (يجب أن يكون الافتراضي).
قد تلاحظ وريتلين لتعليق إذا كان عملية الوجهة إيسن & # 8217؛ ر سحب في البيانات، وتملأ المخزن المؤقت بين العملية (وبالتالي منع تدفق من إكمال).
ومن الصعب بالنسبة لي أن أقول أكثر دون رؤية التعليمات البرمجية الخاصة بك؛ والنظر في نشر وصف أكثر تفصيلا ونموذج التعليمات البرمجية كمسألة على هتبس: // جيثب / مادلسون / ميداليونشيل.
شكرا مايكل. لقد فعلت ذلك، انها قضية # 9. أعيد قراءة سؤالي. ومن الواضح أنني كنت نائما جدا لكتابة أي شيء. كنت أقصد أن أقول إن هناك بعض الخطوات التي أحتاج إليها وأنا في عداد المفقودين. شيء واضح للجميع من قبلي.
هل من الممكن الانتظار لسلسلة معينة في تيار الإخراج من الأمر؟
بول فوند = أوايت cmd. StandardOutput. Expect (سيرشسترينغ، تيموت)؛
لا توجد وظيفة مضمنة لإجراء ذلك. إذا كانت السلسلة لا تمتد على سطر، فيمكنك إجراء ما يلي:
بينما ((لين = cmd. StandardOutput. ReadLine ())! = نول)
إذا كانت سلسلة البحث تمتد أسطر متعددة، يمكنك استخدام أسلوب حلقة متماثلة حيث يمكنك تتبع آخر حرف N حيث N هو طول سلسلة البحث.

معالجة . طريقة ويتفوريكسيت (Int32)
تحتوي الوثائق المرجعية أبي على منزل جديد. انتقل إلى متصفح أبي على docs. microsoft للاطلاع على التجربة الجديدة.
يرشد مكون العملية إلى الانتظار لعدد الملي ثانية المحدد للعملية المقترنة للخروج.
الجمعية: النظام (في System. dll)
المعلمات.
مقدار الوقت، بالمللي ثانية، لانتظار انتهاء العملية المقترنة. الحد الأقصى هو أكبر قيمة ممكنة لعدد صحيح 32 بت، والذي يمثل اللانهاية لنظام التشغيل.
قيمة الإرجاع.
صحيح إذا خرجت العملية المرتبطة بها؛ خلاف ذلك، كاذبة.
تعذر الوصول إلى إعداد الانتظار.
لم يتم تعيين معرف العملية، ولا يمكن تحديد التعامل الذي يمكن تحديد الخاصية إد.
لا توجد عملية مقترنة كائن العملية هذه.
أنت تحاول الاتصال ويتفوريكسيت (Int32) لعملية قيد التشغيل على كمبيوتر بعيد. تتوفر هذه الطريقة فقط للعمليات التي يتم تشغيلها على الكمبيوتر المحلي.
ويتفوريكسيت (Int32) يجعل الانتظار مؤشر الترابط الحالي حتى ينتهي العملية المقترنة. وينبغي أن يسمى بعد أن يتم استدعاء جميع الطرق الأخرى على العملية. لتجنب حظر مؤشر الترابط الحالي، استخدم الحدث الذي تم الخروج منه.
تقوم هذه الطريقة بتوجيه مكون العملية لانتظار مقدار محدود من الوقت لإنهاء العملية. إذا لم يتم إنهاء العملية المقترنة بنهاية الفترة الزمنية بسبب رفض طلب الإنهاء، يتم إرجاع فالس إلى إجراء الاستدعاء. يمكنك تحديد رقم سلبي (لانهائي) لميلي ثانية، وعملية. سوف يتصرف ويتفوريكسيت (Int32) نفس الزائد ويتفوريكسيت (). إذا قمت بتمرير 0 (صفر) إلى الأسلوب، فإنه يرجع صحيح فقط إذا كانت العملية قد خرجت بالفعل؛ وإلا فإنه يعود فورا كاذبة.
في الإطار 3.5 والإصدارات السابقة، إذا كان ميلي ثانية واحدة -1، انتظر التحميل الزائد ويتفوريكسيت (Int32) ل ماكسفالو ميلي ثانية (حوالي 24 يوما)، وليس إلى أجل غير مسمى.
عند إعادة توجيه الإخراج القياسي إلى معالجات أحداث غير متزامنة، فمن الممكن أن معالجة الإخراج لم تكتمل عند إرجاع هذه الطريقة. لضمان اكتمال معالجة الحدث غير المتزامن استدعاء الزائد ويتفوريكسيت () الذي لا يأخذ أي معلمة بعد تلقي صحيح من هذا التحميل الزائد. للمساعدة في ضمان التعامل مع الحدث الذي تم الخروج منه بشكل صحيح في تطبيقات نماذج ويندوز، قم بتعيين الخاصية سينكرونيزينغوبجيكت.
عند إنهاء عملية مقترنة (يتم إيقاف تشغيلها بواسطة نظام التشغيل من خلال إنهاء عادي أو غير طبيعي)، يخزن النظام المعلومات الإدارية حول العملية ويعود إلى المكون الذي كان يسمى ويتفوريكسيت (Int32). يمكن لمكون العملية ثم الوصول إلى المعلومات، والتي تتضمن إكسيتيمي، باستخدام مقبض إلى العملية خرجت.
لأن العملية المرتبطة قد خرجت، الخاصية مقبض المكون لم يعد يشير إلى مورد عملية موجود. بدلا من ذلك، يمكن استخدام المقبض فقط للوصول إلى معلومات نظام التشغيل حول مورد العملية. النظام على بينة من مقابض للخروج من العمليات التي لم يتم إصدارها من قبل مكونات العملية، لذلك فإنه يحتفظ إكسيتيمي والتعامل مع المعلومات في الذاكرة حتى يقوم مكون العملية بتحرير الموارد على وجه التحديد. لهذا السبب، في أي وقت استدعاء بدء تشغيل مثيل عملية استدعاء إغلاق عند انتهاء العملية المقترنة ولم تعد بحاجة إلى أية معلومات إدارية حول هذا الموضوع. إغلاق يحرر الذاكرة المخصصة لعملية خرجت.
راجع مثال التعليمات البرمجية الخاصية إكسيتكود.
للحصول على الثقة الكاملة للمتصل الفوري. لا يمكن استخدام هذا العضو من خلال شفرة موثوق بها جزئيا.

بروسيس ويتفوريكسيت إكسيت كود
الحصول على فيا أب ستور قراءة هذه المشاركة في التطبيق لدينا!
Process. WaitForExit (Int32)
الآن أنا أعمل على تطبيق عداء وحدة التحكم التي تحتوي على التعليمات البرمجية التالية لإخراج السجل والانتظار حتى يتم الانتهاء من العملية:
لدي سؤالان حول هذه القطعة من التعليمات البرمجية.
لاحظت أنه إذا كانت العملية تستغرق وقتا أطول من 30 ثانية، والقنابل دعوة p. ExitCode. ماذا يحدث إذا كانت عمليتي تستغرق ثانية واحدة فقط، فهل ستنتظر 30 ثانية على أي حال أو سيتم إبلاغ العملية من قبل كلر؟
إذا حاولت الحصول على إكسيتكود قبل الخروج من العملية، محاولة يلقي استثناء. فحص الخاصية هاسكسيتد أولا للتحقق مما إذا كان قد تم إنهاء العملية المقترنة.
ليس هناك ما يضمن أنه عندما عودتك إلى ويتفوريكسيت يعود، فإن العملية قد خرجت. من وثائق ويتفوريكسيت:
يتم استخدام الزائد ويتفوريكسيت (Int32) لجعل الانتظار مؤشر الترابط الحالي حتى ينتهي العملية المقترنة. يؤدي هذا التحميل الزائد إلى توجيه مكون العملية إلى انتظار مقدار محدود من الوقت لإنهاء العملية. إذا لم يتم إنهاء العملية المقترنة بنهاية الفترة الزمنية بسبب رفض طلب الإنهاء، يتم إرجاع فالس إلى إجراء الاستدعاء. يمكنك تحديد رقم سالب (لانهائي) ل ميلي ثانية، و process. WaitForExit (Int32) سوف يتصرف نفس الزائد ويتفوريكسيت (). إذا قمت بتمرير 0 (صفر) إلى الأسلوب، فإنه يرجع صحيح فقط إذا كانت العملية قد خرجت بالفعل؛ وإلا فإنه يعود فورا كاذبة.
لاحظ أن هذا يجيب على السؤال الثاني. في حالة انتهاء العملية قبل انتهاء المهلة، ترجع ويتفوريكسيت.
نظرا لأنك حددت مهلة محددة، فإنك تسمح باحتمال عودة الدالة قبل انتهاء العملية. لذلك، يمكنك كتابة التعليمات البرمجية الخاصة بك مثل هذا:

No comments:

Post a Comment