سؤال كيفية قمع تأكيد "إنهاء مهمة الدفعية (Y / N)"؟


في cmd ، عندما نضغط Ctrl + C نحصل على إنهاء التطبيق المستهدف ولكن إذا تم استدعاء التطبيق المستهدف من ملف دفعي ، نحصل على هذا التأكيد "إنهاء مهمة الدفعية (Y / N)". لا أستطيع أن أتذكر مثيلًا اخترت فيه عدم إنهاء مهمة المجموعة. كيف يمكننا تخطي هذا التأكيد؟


133
2017-09-04 12:39


الأصل


هل سبق لك أن جربت إجابة sgmoore؟ superuser.com/questions/35698/... - Arjan
"لا أستطيع أن أتذكر أبدا مثالا اخترت فيه عدم إنهاء مهمة الدُفعة." وفي الواقع ، في معظم الحالات ، يتم إنهاء المهمة حتى إذا أجبت لا ... - PhiLho
PhiLho - لا يمكن أن يكون ذلك صحيحًا ، لأن نصوصي تستمر دائمًا بعد أن أدخل N. أنا غريبة عن سيناريو لديك حيث ينهي البرنامج النصي دفعي بعد إدخال N. - dbenham
كنت آمل أن يكون هذا سهلا ، ولكن كالعادة ، جعلت مايكروسوفت شيئا بسيطا ألم في المؤخرة. الإجابات أدناه هي كل الجهود المبذولة بذل الكثير من الجهد لتجنب هذا الانزعاج الطفيف. أنا فقط منزعج أنه لا توجد طريقة بسيطة لحل هذا. مايكروسوفت على محمل الجد ، ما هو الهدف من هذا موجه؟ نعم أنا متأكد من أن هذا هو السبب في أنني ضغطت على Ctrl + C ... - Chev
هذه المشكلة على الأقل تسبب لي أن أتذكر والاستفادة من -n التبديل ل cygwin بينغ في كثير من الأحيان. - palswim


الأجوبة:


AFAIK لا يمكنك ذلك لأن هذا السلوك هو التصميم والتحكم بواسطة مترجم الأوامر. لا توجد طريقة "لرسم الخرائط" أو حتى "اعتراض" هذا إلا إذا قمت بتجميع المترجم وإعادة ترجمته مباشرة.


44
2017-09-04 12:42



هذا محبط :( - Srikanth
نعم إنها مخيبة للآمال. والأمر الأكثر مخيبًا للآمال هو أن أمر BREAK ، الذي لا يفعل شيئًا بشكل افتراضي ضمن XP ، كان يمكن استخدامه لتبديل المطالبة ... - Synetech
على الرغم من أنه قد يكون صحيحا لا يمكن للمرء أن يجعل المترجم يتصرف بطريقة مختلفة ، وذلك باستخدام start مثل sgmoore اقترح في superuser.com/questions/35698/... يبدو حلا ممتازا تماما بالنسبة لي. - Arjan
ها هو: superuser.com/a/498798/56101 - Totty.js


صحافة السيطرة+C مرتين.


54
2017-09-04 18:28



هذا لن ينجح ولكن يكرر موجه. - Joey
عملت بشكل مثالي بالنسبة لي ، وذلك بفضل! - captainclam
أنا فقط قتلت قاعدة البيانات الخاصة بي عن طريق القيام بذلك! السيناريو كان ينتظر "وقفة" ، لذلك فعلت CTRL-C ، ثم جاء موجه ، لذلك فعلت CTRL-C مرة أخرى ، ثم حملت الملف الدفعي hapilly ، وحذف قاعدة بيانات بلدي! @نرى superuser.com/questions/740004/... - Sebastien Diot
vladr من الأسهل بشكل لا يمكن الاحتفاظ به Ctrl والاستفادة C مرة أخرى مقابل ضرب Y ثم Enter. - Nick T
SebastienDiot لقد جربت تقنية جديدة على برنامج نصي لديه القدرة على تدمير البيانات بشكل دائم؟ هذا ... شجاع. - Basic


في هذه موقع، لقد وجدت حلا فعالا:

script2.cmd < nul

حتى لا تضطر إلى كتابة ذلك في كل مرة أقوم فيها بتشغيل برنامج نصي آخر script.cmd في نفس المجلد مع الخط أعلاه. لقد اختبرت هذه التقنية على نظام XP فقط ، لكن آخرين أكدوا ذلك في Win 7.

يضيف ناثان: خيار آخر هو وضع الشفرة التالية في الجزء العلوي من script.cmd الذي يفعل الشيء نفسه في ملف واحد:

rem Bypass "Terminate Batch Job" prompt.
if "%~1"=="-FIXED_CTRL_C" (
   REM Remove the -FIXED_CTRL_C parameter
   SHIFT
) ELSE (
   REM Run the batch with <NUL and -FIXED_CTRL_C
   CALL <NUL %0 -FIXED_CTRL_C %*
   GOTO :EOF
)

42
2017-11-03 03:29



إذا قمت باستدعاء ملف دفعي من داخل نفسه (بدون استخدام الأمر CALL) ، يتم نقل التنفيذ "بشكل دائم". إذا تمت إعادة توجيه STDIN إلى NUL ، فستظهر أي مطالبة "مهمة دفعية الإنهاء" ، ولكن لن تنتظر (لأن STDIN قد اختفت) للإدخال. هذا يعمل بالنسبة لي ... - William
هذا يعمل في ويندوز 7. - William
يعمل ، إلا إذا كنت بحاجة إلى إدخال المستخدم في الدفعة. - Augusto Men
William ، لم يكن مجرد الاتصال بالبرنامج النصي مناسبًا لي ، ولكنني توصلت إلى حل بديل: @IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command]). يستدعي نفسه بشكل متكرر ، ولكن مع حجة للمرة الثانية. إذا كان للبرنامج النصي الخاص بك وسيطات ، فيحتمل أن تستخدم أول وسيطة موضعية غير مستخدمة. قد يكون هذا مشكلة إذا كان النص يحتوي على الكثير من الحجج. لم يحتاج النص البرمجي الخاص بي إلى حجج أو إدخال المستخدم. - jpmc26
عملت إجابة jpmc بالنسبة لي. هل صدى الرتق نهاية (ذ / ن)؟ الرسالة في نهاية ذلك رغم ذلك ، ولكن لا يتوقف عن ذلك. - ggb667


التثبت صلصلة وتغيير الإعداد "terminate_autoanswer". ملف الإعدادات يجب أن يكون هنا: C:\Users\<username>\AppData\Local\clink\settings.

# name: Auto-answer terminate prompt
# type: enum
# Automatically answers cmd.exe's 'Terminate batch job (Y/N)?' prompts. 0 =
# disabled, 1 = answer 'Y', 2 = answer 'N'.
terminate_autoanswer = 1

هذا ثم "يعمل فقط" مع أي نافذة cmd.exe. لا تحتاج إلى تغيير ما هو قيد التشغيل أو غير ذلك ، لأن clang piggy backs على cmd.exe.

Frickin 'رائع ، المنظمة البحرية الدولية!


22
2018-04-03 06:50



Clink رائعة ولكن هذا لا يعمل بالنسبة لي باستخدام cmd.exe أو Console2. لا يزال يسأل ولا يحصل على الملء التلقائي. - iono
tometoftom: هل قمت بتغيير ملف الإعدادات على النحو الوارد أعلاه؟ كان علي أن أفعل ذلك كي أتمكن من العمل. (لاحظ أنه يجب أن تكون مسؤولاً لحفظ الملف بشكل صحيح على نظام التشغيل Windows Vista والإصدارات الأحدث ...) - Macke
نعم ، مع تغيير الإعدادات. أنا مشرف :( حاولت القيام بما يعادل "تشغيل كمسؤول" للملفات التنفيذية عن طريق عمل اختصار لملف الإعدادات ، انقر بزر الماوس الأيمن على -> خصائص ، علامة التبويب اختصار ، خيارات متقدمة ... ثم "تشغيل كمسؤول" رمادي. - iono
آه ، لا يوجد حتى النرد. تنهيدة عميقة مايكروسوفت ، في سبيل الله ... - iono
iono هل لديك إصدار Windows غير اللغة الإنجليزية؟ في هذه الحالة ، يتعذر على clink الرد التلقائي على المطالبة حتى الإصدار 0.4.3 قبل بضعة أيام: github.com/mridgers/clink/releases/tag/0.4.3 - schlamar


إذا لم تكن بحاجة إلى القيام بأي شيء في الملف الدفعي بعد انتهاء التطبيق بشكل طبيعي ، فقم باستخدام start يضمن الأمر أن الملف الدفعي قد انتهى بالفعل عند الضغط على Ctrl-C. وبالتالي فإن الرسالة لن تظهر.

فمثلا:

@صدى خارج

قم بتعيين my_command = ping.exe
عيّن my_params = -t www.google.com

echo Command ليتم تنفيذها بواسطة "start":٪ my_command٪٪ my_params٪

:: عند عدم استخدام / B أو / WAIT ، سيؤدي ذلك إلى إنشاء نافذة جديدة ، بينما
:: سيستمر تنفيذ هذا الملف الدفعي جدا في النافذة الحالية:

start٪ my_command٪٪ my_params٪

صدى صوت.
echo سيتم تنفيذ هذا الخط قبل الانتهاء من "start". إذا هذا
سوف تكتمل ملف دفعي صدى قبل ضغط واحد Ctrl-C في النافذة الأخرى.
صدى صوت.

:: فقط لاختبار استخدام "إيقاف مؤقت" لإظهار "اضغط على أي مفتاح للمتابعة" ، لنرى
:: إخراج أوامر "echo". تأكد من الضغط على Ctrl-C في النافذة
:: يقوم بتشغيل الأمر 'ping' (ليس في هذه النافذة). أو ببساطة إزالة
:: السطر التالي عند الخلط:

وقفة

(تم اختباره على نظام التشغيل Windows XP.)


16
2017-09-04 13:33



لا اعرف اذا start من شأنه أن يساعد بالفعل ، ولكن يبدو لي معقولاً. لذلك أنا أتساءل عما إذا كان downvote يعني أن هذا لن ينجح؟ أو ربما كل من downvoted لا يعرف ويندوز " start (أو على وجه الخصوص start /wait و start /b) أمر؟ نرى microsoft.com/resources/documentation/windows/xp/all/proddocs/... ثم. يرجى توضيح downvote؟ - Arjan
start لن يعمل. عند تشغيل cmd كملف دفعي ، فإن النقر على Ctrl + C سيؤدي إلى إنهاء العملية الجارية حاليًا وإظهار السؤال. - Joey
يعمل +1 لي. ومع ذلك ، / b إيقاف تشغيل Ctrl + C (وهو أمر مزعج). - Nick Bolton
هذا جيد إذا كنت النقر المزدوج فوق ملف الدُفعات. ولكن ماذا لو قمت بتشغيل ملف الدُفعات في وحدة التحكم؟ - Helgi
(التحدث من ويندوز 7 ، لست متأكدا إذا كان ذلك ينطبق على XP) و غافل المطور استأجرها مايكروسوفت لترميز start جعلت القيادة قرار غبي لجعل عنوان من النافذة على حد سواء إلزامية واختيارية في نفس الوقت - بطريقة مربكة إلى حد ما. حتى إذا كان لديك %my_command% محاطا في اقتباسات مزدوجة ، فإنه يصبح عنوان من النافذة والمطر الأول في %my_params% يصبح أمر. لتكون آمنة ، استخدم start "some title here" %my_command% %my_params%. معظم مجرد استخدام "" ويلعن المطور لعدم استخدام /TITLE أو /T الخيار بدلا من ذلك لتعيين العنوان. - ADTC


لقد تم القتال مع هذه الرغبة لتجنب "دفعة وظيفة دفعة" موجه لبعض الوقت.

بلدي آخر عيد الغطاس هو قليلا من خفة اليد (أو نافذة وحدة التحكم) ، عن طريق استبدال مثيل واحد من cmd.exe مع آخر. يتم تحقيق ذلك عن طريق تنفيذ الأمر / البرنامج عبر start cmd /k يتبع على الفور من قبل exit في ال .BAT ملف.

تختفي نافذة وحدة التحكم الأصلية ويمكن إيقاف تشغيل جهاز الاستبدال نظيفًا عبر السيطرة-C.

خذ بعين الاعتبار المثال التالي من traceroute يمكن ان تنقطع السيطرة+C، أو مسموح به لإكمال ، إرجاع المستخدم إلى C:\> مستعجل:

@echo off

set timeout=100
if not "%2"=="" set timeout=%2

start cmd /k tracert -w %timeout% %1
exit

قد لا يكون استبدال البيئة لمترجم أوامر جديد متاحًا للجميع ، ولكن ، بالعين المجردة ، يبدو ويعمل جيدًا بالنسبة لي.


13
2018-05-16 17:05



+1 مقاربة مبتكرة جدًّا وعلى الرغم من أنني أتفق مع ti ليس بديلاً تامًا ، فإنه يعمل جيدًا (على الرغم من أنك لم تقلقني عندما بدأت مشاركتك مع "استبدال cmd.exe" - كانت أجهزة الإنذار الأمنية ترن حتى وصلت إلى المثال وأدركت ما المقصود) - Basic
يجب عليك استخدامها exit /b للخروج من البرنامج النصي الدفعي - Sebastian Godelet
SebastianGodelet: هذه نصيحة جيدة بشكل عام ، ولكن الهدف هو إغلاق وحدة التحكم (الأصلية) نافذة او شباك، نظرا لأن الأمر المستهدف يتم إطلاقه في الجديد نافذة او شباك. - mklement0


حل Gringo جيد ، ولكنه لا يعمل جيدًا مع البرامج النصية التي تمر على قائمة الحجة (أي python myscript.py %*)، منذ SHIFT لا تحديث %*. هناك الحلول، ولكن لديهم قيود معينة.

في ما يلي التعديل الذي انتهى بي:

IF [%JUSTTERMINATE%] == [OKAY] (
    SET JUSTTERMINATE=
    python myscript.py %*
) ELSE (
    SET JUSTTERMINATE=OKAY
    CALL %0 %* <NUL
)

99. (9)٪ لا تشوبه شائبة.


7
2018-02-12 11:33



هذا لن ينجح إذا myscript.py يريد أن يقرأ من stdin. - jamesdlin