Вопрос: Как подавить подтверждение «Завершить пакетное задание (Y / N)»?


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


125
2017-09-04 12:39


Источник


Вы когда-нибудь пробовали ответить sgmoore? superuser.com/questions/35698/... - Arjan
«Я никогда не помню экземпляр, где я решил не прекращать пакетную работу». И фактически, в большинстве случаев работа прекращается, даже если вы отвечаете «Нет» ... - PhiLho
@PhiLho - Это не может быть правдой, так как мои скрипты всегда продолжаются после ввода N, Мне любопытно, какой у вас сценарий, когда пакетный скрипт завершается после ввода N, - dbenham
Я надеялся, что это будет легко, но, как обычно, Microsoft сделала что-то простое в заднице. Нижеприведенные ответы расходуют слишком много усилий, чтобы избежать этого незначительного раздражения. Меня просто раздражает, что нет простого способа решить эту проблему. Серьезно Microsoft, в чем смысл этой подсказки? Да, я уверен, вот почему я нажал Ctrl + C ... - Chev
Эта проблема, по крайней мере, заставляет меня помнить и использовать -n переключатель для cygwin пинг чаще. - palswim


Ответы:


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


40
2017-09-04 12:42



Это неутешительно :( - Srikanth
Да, это неутешительно. Еще более разочаровывает то, что команда BREAK, которая по умолчанию ничего не делает под XP, могла бы использоваться для переключения приглашения ... - Synetech
Хотя это может быть правдой, нельзя заставить интерпретатора вести себя по-разному, используя start как sgmoore, предложенный в superuser.com/questions/35698/... кажется совершенно прекрасным обходным путем для меня. - Arjan
Вот: superuser.com/a/498798/56101 - Totty.js


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


52
2017-09-04 18:28



Это не сработает, а скорее повторит приглашение. - Joey
отлично работал для меня, спасибо! - captainclam
Я просто убил свою базу данных, делая это! Сценарий ждал «пауза», поэтому я сделал CTRL-C, а затем появилось приглашение, поэтому я снова нажал CTRL-C, а затем пакетный файл продолжил и удалил мою базу данных! @видеть 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
)

40
2017-11-03 03:29



Если вы вызываете пакетный файл из себя (без использования команды CALL), выполнение «постоянно» переносится. Если STDIN перенаправляется на NUL, любое приглашение «Завершить пакетное задание» все равно появится, но не будет ждать (потому что STDIN ушел) для ввода. Это работает для меня ... - William
Это работает в Windows 7. - William
Он работает, если вам не нужен ввод пользователя в пакет. - Augusto Men
@William, просто вызов сценария не работал для меня, но я придумал обходной путь: @IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command]), Вызывает себя рекурсивно, но с аргументом второй раз. Если у вашего скрипта есть аргументы, вы можете использовать первый неиспользуемый позиционный аргумент. Это может быть проблематично, если в вашем скрипте много аргументов. Мой скрипт не нуждался в аргументах или пользовательских вводах. - jpmc26
Ответ jpmc сработал для меня. Это эхо-чертово Terminate (y / n)? сообщение в конце концов, но не останавливается на этом. - 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. Вам не нужно изменять то, что работает, или иначе, так как clink piggy-backs на cmd.exe.

Фрицкин, потрясающе, ИМО!


22
2018-04-03 06:50



Clink - это фантастика, но это не работает для меня, используя cmd.exe или Console2. Он все еще спрашивает, и он не получает автозаполнение. - iono
@tometoftom: Вы изменили файл настроек, как указано выше? Я должен был сделать это, чтобы заставить его работать. (Обратите внимание, что вы должны быть администратором, чтобы сохранить файл правильно в Windows Vista и выше ...) - Macke
Да, с изменением настроек. Я администратор :( Я попытался сделать эквивалент «Запуск от имени администратора» для исполняемых файлов, сделав ярлык файла настроек, щелкните правой кнопкой мыши -> Свойства, вкладка «Ярлык», «Дополнительно» ... «Запуск от имени администратора» седой. - iono
Ах, до сих пор нет кубиков. глубокий вздох Microsoft, ради бога ... - iono
@iono у вас есть версия для Windows, отличная от английского? В этом случае клик не смог ответить автоответчиком до версии 0.4.3 несколько дней назад: github.com/mridgers/clink/releases/tag/0.4.3 - schlamar


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

Например:

@echo off

set my_command = ping.exe
set my_params = -t www.google.com

echo Команда, выполняемая «start»:% my_command%% my_params%

:: Когда НЕ используется / B или / WAIT, тогда это создаст новое окно, тогда как
:: выполнение этого очень командного файла будет продолжаться в текущем окне:

start% my_command%% my_params%

эхо.
echo Эта строка будет выполнена до начала «начала». Итак, это
файл echo batch будет завершен ПЕРЕД одним нажатием Ctrl-C в другом окне.
эхо.

:: Только для тестирования используйте «пауза», чтобы показать «Нажмите любую клавишу, чтобы продолжить», чтобы увидеть
:: вывод команд «эхо». Обязательно нажмите Ctrl-C в окне
:: this запускает команду «ping» (не в этом самом окне). Или просто удалите
:: следующая строка, когда путают:

Пауза

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


15
2017-09-04 13:33



Я не знаю, если start действительно поможет, но это звучит правдоподобно для меня. Поэтому я задаюсь вопросом, подразумевает ли downvote, что это НЕ будет работать? Или, может быть, кто бы ни зашел, не знает Windows ' start (или особенно start /wait а также start /b) команда? Видеть microsoft.com/resources/documentation/windows/xp/all/proddocs/... тогда. Пожалуйста, объясните нижний план? - Arjan
start не будет работать. Всякий раз, когда cmd запускает командный файл, нажатие Ctrl + C приведет к завершению текущего процесса и покажет вопрос. - Joey
+1 работает для меня. Однако, / b отключает обработку Ctrl + C (что раздражает). - Nick Bolton
Это нормально, если вы дважды щелкаете командный файл. Но что, если вы запускаете командный файл в консоли? - Helgi
(Говоря с Windows 7, не уверен, если применимо к XP). легкомысленный разработчик, нанятый Microsoft кодировать start команда сделала немое решение сделать заглавие окна как обязательного, так и необязательного в то же время - довольно запутанным способом. Поэтому, если когда-либо %my_command%заключен в двойные кавычки, он становится заглавие окна и первый параметр в %my_params% становится команда, Чтобы быть в безопасности, используйте start "some title here" %my_command% %my_params%, Просто используйте "" и проклинать разработчика за неиспользование /TITLE или /T вместо этого укажите заголовок. - ADTC


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

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

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

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

@echo off

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

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

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


10
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


Видеть этот вопрос переполнения стека,

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


5
2017-09-04 18:21





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

Этот командный файл выполнялся всякий раз, когда я запускал ping из командной строки, где текущий каталог является моим пользовательским каталогом. Ping-ing из окна «Run» или из другого каталога пользователя работал хорошо.

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


0
2018-01-06 14:08





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


0
2018-03-17 20:08





Просто перенаправляйте пакетный stdin в null, добавив <nul в конец команды.


0
2018-02-22 16:15



Я думаю, вы могли иметь в виду <nul (поскольку> nul отправляет все stdout в null). - Brian Phillips