Как подавить подтверждение «Прервать пакетное задание (Y / N)»?

89550
Srikanth

В cmd, когда мы нажимаем Ctrl + C, мы завершаем работу целевого приложения, но если целевое приложение вызывается из пакетного файла, мы получаем это подтверждение «Завершить пакетное задание (Y / N)». Я никогда не могу вспомнить случай, когда я решил не прерывать пакетное задание. Как мы можем пропустить это подтверждение?

134
Вы когда-нибудь пробовали ответить на вопрос sgmoore? http://superuser.com/questions/35698/how-to-supress-terminate-batch-job-yn-confirmation/35741#35741 Arjan 14 лет назад 0
«Я никогда не могу вспомнить случай, когда я решил не прерывать пакетное задание». И на самом деле, в большинстве случаев работа прекращается, даже если вы отвечаете Нет ... PhiLho 9 лет назад 8
@PhiLho - Это не может быть правдой, так как мои сценарии всегда продолжаются после того, как я ввожу `N`. Мне интересно, какой у вас сценарий, когда пакетный скрипт завершается после ввода `N`. dbenham 8 лет назад 0
Я надеялся, что это будет легко, но, как обычно, Microsoft сделала что-то простое болью в заднице. Все ответы, приведенные ниже, требуют слишком много усилий, чтобы избежать этого незначительного раздражения. Я просто раздражен, что не существует простого способа решить эту проблему. Серьезно, Microsoft, какой смысл этого приглашения? Да, я уверен, поэтому я нажал Ctrl + C ... Chev 8 лет назад 0
Эта проблема, по крайней мере, побуждает меня помнить и чаще использовать ключ `-n` для cygwin ** ping **. palswim 8 лет назад 0
У меня нет репутации, чтобы публиковать ответ, но я обнаружил, что на Windows 7 у меня работает следующее при запуске внешнего Java-приложения (хотя по какой-то причине оно очищает историю командного окна): `@CMD / K" java -jar "% ~ dpn0.jar"% * "& EXIT 0` Jeff G 7 лет назад 0

16 ответов на вопрос

54
Kirill V. Lyadvinsky

Нажмите Ctrl+ Cдважды.

Это не будет работать, а скорее повторяет подсказку. Joey 14 лет назад 4
Уверены ли вы? Я только попробовал это в командной строке XP, и это работало. Я проверю в DOS 7.11 позже, но я почти уверен, что Enter заставляет его повторять приглашение, а не Ctrl-C. Synetech 14 лет назад 0
Я попробовал это в PS 2.0 на Win7, и это работало. Однако я видел повторяющуюся подсказку тоже в том же env. Это тайна. Тем не менее +1. jcollum 12 лет назад 0
отлично сработало для меня, спасибо! captainclam 11 лет назад 5
Я просто убил свою базу данных, сделав это! Сценарий ожидал «паузы», поэтому я сделал CTRL-C, а затем пришло приглашение, поэтому я снова сделал CTRL-C, а затем пакетный файл продолжил и удалил мою базу данных! @ смотри http://superuser.com/questions/740004/why-does-ctrl-c-on-terminate-batch-job-prompt-means-carry-on Sebastien Diot 10 лет назад 4
Это не то, что спросил ОП. Он мог так же легко набрать «N» после ^ C. vladr 8 лет назад 2
@vladr, бесконечно легче удерживать клавишу `Ctrl` и снова нажимать` C`, вместо того, чтобы нажимать `Y`, а затем` Enter`. Nick T 8 лет назад 3
@SebastienDiot Вы опробовали новую технику в сценарии, которая могла навсегда уничтожить данные? Это ... Храбрый. Basic 8 лет назад 15
@Basic Во-первых, это была «моя» (личная) база данных, а не продуктивная система, поэтому только «потеря производительности» (повторная загрузка и восстановление БД), а не «потерянные данные». Во-вторых, как «CTRL-C» является «новой техникой»? : D Sebastien Diot 8 лет назад 1
Дважды? Не для меня: `^ C ^ CTerminate пакетное задание (Y / N)? ^ CTerateate пакетное задание (да / нет)? ^ C ^ CTerminate пакетное задание (да / нет)? ^ C` Post Self 6 лет назад 0
@ kim366 есть ли шанс, что ваше приложение было перезапущено автоматически? Kirill V. Lyadvinsky 6 лет назад 0
@ KirillV.Lyadvinsky Я не знаю. Я заканчивал Экспресс-сервер. Я слишком новичок во всем этом, чтобы сказать наверняка Post Self 6 лет назад 0
Это решение работает только 2-3 раза подряд. Вы можете создать цикл с какой-то длинной командой внутри. Вы перезапустите цикл только несколько раз. И в какой-то момент все терминальные окна закрыты. Sergey 5 лет назад 0
44
BinaryMisfit

AFAIK вы не можете, так как это поведение разработано и контролируется интерпретатором команд. Нет способа «отобразить» или даже «перехватить» это, если вы не декомпилируете и не перекомпилируете интерпретатор напрямую.

Это разочаровывает :( Srikanth 14 лет назад 29
Да, это разочаровывает. Что еще более разочаровывает, так это то, что команда BREAK, которая по умолчанию ничего не делает в XP, могла использоваться для переключения подсказки… Synetech 14 лет назад 0
Хотя это может быть правдой, нельзя заставить интерпретатор вести себя по-другому, используя `start`, как sgmoore, предложенный на http://superuser.com/questions/35698/how-to-supress-terminate-batch-job-yn-confirmation/35741 # 35741 кажется мне прекрасным решением проблемы. Arjan 14 лет назад 2
Вот оно: http://superuser.com/a/498798/56101 Totty.js 9 лет назад 0
43
Gringo Suave

At this site, I found an effective solution:

script2.cmd < nul 

To not have to type this out every time I made a second script called script.cmd in the same folder with the line above. I've tested this technique on XP only, but others have confirmed it on Win 7.

Nathan adds: another option is to put the following code at the top of script.cmd which does the same thing in one file:

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 ) 
Если вы вызываете пакетный файл изнутри себя (без использования команды CALL), выполнение передается «навсегда». Если STDIN перенаправляется в NUL, любое приглашение «Завершить пакетное задание» все равно будет отображаться, но не будет ждать (поскольку STDIN пропал) для ввода. Это работает для меня ... William 11 лет назад 1
Это работает в Windows 7. William 11 лет назад 3
Это работает, если вам не нужен ввод пользователя в пакете. Augusto Men 11 лет назад 15
@William, просто вызов сценария у меня не сработал, но я нашел обходной путь: `@IF" "=="% 1 "(@% 0 CALLED <nul) ELSE (@ [ваша команда])` , Вызывает себя рекурсивно, но с аргументом второй раз. Если в вашем скрипте есть аргументы, вы можете использовать первый неиспользуемый позиционный аргумент. Это может быть проблематично, если в вашем сценарии много аргументов. Мой скрипт не нуждался в аргументах или вводе пользователем. jpmc26 10 лет назад 2
Ответ jpmc работал для меня. Это эхом проклятый Терминат (да / нет)? сообщение в конце, хотя, но не останавливается на этом. ggb667 10 лет назад 0
Смотрите мой [ответ] (http://superuser.com/questions/35698/how-to-supress-terminate-batch-job-yn-confirmation/715798#715798), если ваш скрипт использует `% *`. Olegs Jeremejevs 10 лет назад 0
идеально, должно быть принято! Totty.js 9 лет назад 0
Я думаю: `start / b / wait cmd / c` работает лучше Sebastian Godelet 9 лет назад 0
Другая проблема, связанная с этим ответом, заключается в том, что он не будет работать, если ваш сценарий хочет прочитать фактический ввод из стандартного ввода. jamesdlin 6 лет назад 0
23
Macke

Install Clink and change the "terminate_autoanswer" setting. The settings file should be here: 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 

This then "just works" with any cmd.exe window. You don't need to alter what's running or otherwise, since clink piggy-backs on cmd.exe.

Frickin' awesome, IMO!

Клинк фантастический, но это не работает для меня, используя cmd.exe или Console2. Он все еще спрашивает и не заполняется автоматически. iono 11 лет назад 0
@tometoftom: Вы изменили файл настроек, как указано выше? Я должен был сделать это, чтобы заставить его работать. (Обратите внимание, что вы должны быть администратором, чтобы правильно сохранить файл в Windows Vista и выше ...) Macke 11 лет назад 0
Ага, с настройками поменял. Я являюсь администратором :( Я попытался сделать эквивалент «Запуск от имени администратора» для исполняемых файлов, сделав ярлык на файле настроек, щелкнув правой кнопкой мыши -> Свойства, вкладку «Ярлык», «Дополнительно», затем «Запуск от имени администратора» серый. iono 11 лет назад 0
Запустите блокнот в режиме администратора, затем отредактируйте файл. Macke 11 лет назад 0
Ах, до сих пор нет кости. * глубокий вздох * Microsoft, ради бога ... iono 11 лет назад 2
@iono у вас не английская версия для Windows? В этом случае clink не мог автоматически ответить на приглашение до выпуска версии 0.4.3 несколько дней назад: https://github.com/mridgers/clink/releases/tag/0.4.3. schlamar 9 лет назад 2
Я могу подтвердить, что последняя версия Clink теперь прекрасно поддерживает французскую подсказку "Terminer le program de commandes" ... :-) Давно поддерживаемая неприятность, по крайней мере, удалена с моего компьютера! Примечание: Clink идеально подходит для ConEmu, первой найденной мной хорошей замены для командной строки Windows. PhiLho 9 лет назад 0
Связано: для тех, кто ** использует cmder **, параметр находится в `\ cmder \ config \ settings`. Смотрите проблему, связанную здесь https://github.com/cmderdev/cmder/issues/1666 edmundo096 6 лет назад 1
черт побери @ edmundo096 Я обнаружил настройку и все с гордостью был готов оставить свой след в этом сообщении, но потом я заметил, что ваш комментарий был похоронен ... д'оо. +1, может быть, сейчас его не похоронят :) Adam Plocher 5 лет назад 0
Везде везде отлично! Самый полезный ответ месяца! Большое спасибо! (ConEmu перестал работать, но это нормально, я просто пою cmd сейчас) Vladimir Ishenko 5 лет назад 0
16
sgmoore

Если вам не нужно ничего делать в пакетном файле после того, как ваше приложение завершится нормально, то использование startкоманды гарантирует, что пакетный файл уже завершен к тому времени, когда вы нажимаете Ctrl-C. И, следовательно, сообщение не появится.

Например:

@ эхо выключено  set my_command = ping.exe установить my_params = -t www.google.com  Команда echo, которая будет выполнена командой start:% my_command%% my_params%  :: Если НЕ использовать / B или / WAIT, то это создаст новое окно, а :: выполнение этого самого пакетного файла будет продолжено в текущем окне:  start% my_command%% my_params%  эхо. echo Эта строка будет выполнена ДО того, как 'start' будет даже закончен. Итак, это Пакетный файл echo будет завершен ДО того, как вы нажмете Ctrl-C в другом окне. эхо.  :: Просто для тестирования используйте «пауза», чтобы показать «Нажмите любую клавишу, чтобы продолжить», чтобы увидеть :: вывод команд 'echo'. Обязательно нажмите Ctrl-C в окне :: который запускает команду ping (не в этом самом окне). Или просто удалите :: следующая строка в замешательстве:  Пауза 

(Проверено на Windows XP.)

Я не знаю, поможет ли `start`, но это звучит правдоподобно для меня. Так что мне интересно, подразумевает ли понижающий голос, что это НЕ будет работать? Или, может быть, тот, кто отказался от голосования, не знает Windows `start` (или особенно` start / wait` и `start / b`) команды? См. Http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/start.mspx тогда. Пожалуйста, объясните отрицательный голос? Arjan 14 лет назад 0
`start` не сработает. Всякий раз, когда cmd запускает пакетный файл, нажатие Ctrl + C приведет к завершению текущего запущенного процесса и отображению вопроса. Joey 14 лет назад 0
Все, что я могу сказать, это то, что это работает для меня, и важный момент заключается в том, что cmd НЕ запускает командный файл (потому что он закончил). sgmoore 14 лет назад 0
Но можно ли тогда закрыть приложение? Итак: можно ли использовать Ctrl-C для завершения приложения, которое было вызвано с помощью `start`? (Все еще звучит правдоподобно для меня ...) Arjan 14 лет назад 0
Завершение Ctrl-C приложения не зависит от того, запущено ли приложение из командного файла. Например, если (в XP) вы запустите c: \ windows \ system32 \ edit, он не будет реагировать на Ctrl-C независимо от того, как он запущен. Однако дефрагментация действительно отвечает на Ctrl-C. Таким образом, самый простой способ проверить это - создать командный файл, который просто говорит start defrag c: sgmoore 14 лет назад 0
Я собираюсь загрузить старую машину Windows, чтобы доказать, что это работает, но я уже проголосовал, и я говорю, что это работает, не имеет большого значения, я думаю ... Итак, @vito, вы когда-нибудь проверяли этот ответ? Это действительно похоже на решение, о котором просили! Arjan 14 лет назад 0
Хорошо, я наконец загрузил старую машину Windows, чтобы подтвердить этот ответ. И sgmoore прав, как я уже ожидал. Arjan 14 лет назад 0
+1 работает на меня. Однако / b отключает обработку Ctrl + C (что раздражает). Nick Bolton 14 лет назад 1
Это хорошо, если вы дважды щелкнули командный файл. Но что, если вы запустите командный файл в консоли? Helgi 12 лет назад 3
(Говоря из Windows 7, не уверен, что применимо к XP) * бездумный * разработчик, нанятый * Microsoft * для кодирования команды `start`, принял глупое решение сделать ** заголовок ** окна обязательным и необязательным в в то же время - довольно запутанно. Поэтому, если ваш `% my_command%` заключен в двойные кавычки, он становится * заголовком * окна, а первый параметр в `% my_params%` становится * командой *. Чтобы быть в безопасности, используйте `start 'some title here"% my_command%% my_params% `. Большинство просто используют "" "и проклинают разработчика за то, что он не использует параметр` / TITLE` или `/ T` вместо того, чтобы установить заголовок. ADTC 8 лет назад 6
13
ViperGeek

Я боролся с этим желанием на некоторое время избежать приглашения «Завершить пакетную работу».

Мое последнее прозрение - это ловкость рук (или окно консоли), заменив один экземпляр cmd.exeдругим. Это достигается путем выполнения команды / программы через и start cmd /kсразу же exitв .BATфайле.

Исходное окно консоли исчезает, а замену можно полностью остановить с помощью Ctrl- C.

Рассмотрим следующий пример, tracerouteкоторый может быть прерван Ctrl+ Cили разрешен для завершения, возвращая пользователя к C:\>приглашению:

@echo off  set timeout=100 if not "%2"=="" set timeout=%2  start cmd /k tracert -w %timeout% %1 exit 

Замена окружения на новый командный интерпретатор может быть не для всех, но, на мой взгляд, выглядит и работает хорошо для меня.

+1 Очень новаторский подход, и хотя я согласен, что это не точная замена, он работает хорошо (хотя вы действительно волновали меня, когда начинали свой пост с «замены cmd.exe» - сигналы безопасности звучали, пока я не добрался до примера и не понял, что ты имел в виду) Basic 11 лет назад 0
вы должны использовать `exit / b` для выхода из пакетного скрипта Sebastian Godelet 8 лет назад 0
@SebastianGodelet: В общем, это хороший совет, но здесь действительно нужно закрыть (оригинальную) консоль _window_, учитывая, что целевая команда запускается в _new_ окне. mklement0 5 лет назад 1
7
Olegs Jeremejevs

Gringo's solution is good, but doesn't work well with scripts which pass along the argument list (i.e. python myscript.py %*), since SHIFT doesn't update %*. There are workarounds, but they have certain limitations.

Here's the modification I ended up with:

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

99.(9)% flawless.

Это не сработает, если `myscript.py` хочет читать со стандартного ввода. jamesdlin 6 лет назад 0
4
Joey

Смотрите этот вопрос переполнения стека .

Тем не менее, исправление cmd.exe не то, что я бы сделал для этого.

0

В моем случае именно файл ping.bat, который находился прямо в моем пользовательском каталоге (C: \ Users \ в Vista или C: \ Documents and Settings \ в XP), неопределенно удерживал пакетное задание.

Этот пакетный файл выполнялся всякий раз, когда я запускал ping из командной строки, где текущим каталогом является мой пользовательский каталог. Пинг из окна «Выполнить» или из каталога другого пользователя работал нормально.

Удалил файл из моего пользовательского каталога, и проблема была решена!

0

Пуск работает, но теперь окно, открытое командным файлом, изменилось по сравнению с опциями, которые у меня были, и «свойства» отключены (не отвечает).