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

154

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

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

Ответы:

52

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

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

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

Кирилл Васильевич Лядвинский
источник
5
Это не будет работать, а скорее повторяет подсказку.
Джои
8
Я просто убил свою базу данных, сделав это! Сценарий ожидал «паузы», поэтому я сделал CTRL-C, а затем пришло приглашение, поэтому я снова сделал CTRL-C, а затем пакетный файл продолжил и удалил мою базу данных! @see superuser.com/questions/740004/…
Себастьен Диот,
2
Это не то, что спросил ОП. Он мог так же легко набрать «N» после ^ C.
влад
3
@vladr это бесконечно легче держать Ctrlи нажмите Cснова против удара Yзатем Enter.
Ник Т
21
@SebastienDiot Вы опробовали новую технику в сценарии, которая могла навсегда уничтожить данные? Это ... Храбрый.
Базовый
58

На этом сайте я нашел эффективное решение:

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
)
Гринго Суаве
источник
2
Если вы вызываете пакетный файл изнутри себя (без использования команды CALL), выполнение передается «навсегда». Если STDIN перенаправляется в NUL, любое приглашение «Завершить пакетное задание» все равно будет отображаться, но не будет ждать (поскольку STDIN пропал) для ввода. Это работает для меня ...
Уильям
3
Это работает в Windows 7.
Уильям
17
Это работает, если вам не нужен ввод пользователя в пакете.
Аугусто Мэн
2
@William, просто называя сценарий не работает для меня, но я придумал обходной путь: @IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command]). Вызывает себя рекурсивно, но с аргументом второй раз. Если в вашем скрипте есть аргументы, вы можете использовать первый неиспользуемый позиционный аргумент. Это может быть проблематично, если в вашем скрипте много аргументов. Мой скрипт не нуждался в аргументах или вводе пользователем.
jpmc26
Ответ jpmc работал для меня. Это повторяет чертову Терминату (да / нет)? сообщение в конце, хотя, но не останавливается на этом.
ggb667
29

Установите Clink и измените настройку 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. Вам не нужно изменять то, что работает или что-то иное, так как кликните копилки на cmd.exe.

Черт возьми, ИМО!

Маке
источник
Клинк фантастический, но это не работает для меня, используя cmd.exe или Console2. Он все еще спрашивает и не заполняется автоматически.
Ионо
@tometoftom: Вы изменили файл настроек, как указано выше? Я должен был сделать это, чтобы заставить его работать. (Обратите внимание, что вы должны быть администратором, чтобы правильно сохранить файл в Windows Vista и выше ...)
Macke
3
Ах, до сих пор нет кости. Глубоко вздохните, Microsoft, ради всего святого ...
Ионо
3
@iono у вас есть неанглийская версия Windows? В этом случае clink не мог автоматически ответить на приглашение до выпуска версии 0.4.3 несколько дней назад: github.com/mridgers/clink/releases/tag/0.4.3
schlamar
3
Связано: для тех, кто использует cmder , настройка включена\cmder\config\settings . См.
Проблему,
17

Если вам не нужно ничего делать в пакетном файле после нормального завершения приложения, то использование 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.)

sgmoore
источник
Я не знаю start, действительно ли это поможет, но это звучит правдоподобно для меня. Так что мне интересно, подразумевает ли понижающий голос, что это НЕ будет работать? Или, может быть, тот, кто отказался от голосования, не знает команду Windows start(или особенно start /waitи start /b)? См. Microsoft.com/resources/documentation/windows/xp/all/proddocs/… затем. Пожалуйста, объясните отрицательный голос?
Арьян
startне сработает Всякий раз, когда cmd запускает пакетный файл, нажатие Ctrl + C приведет к завершению текущего запущенного процесса и отображению вопроса.
Джои
1
+1 работает на меня. Однако / b отключает обработку Ctrl + C (что раздражает).
Ник Болтон
3
Это хорошо, если вы дважды щелкнули командный файл. Но что, если вы запустите командный файл в консоли?
Хельги
8
(Говоря из Windows 7, не уверен, применимо ли это к XP) Бездумный разработчик, нанятый Microsoft для кодирования startкоманды, принял глупое решение сделать заголовок окна обязательным и необязательным одновременно - довольно запутанным способом. Таким образом, если ваш %my_command%символ заключен в двойные кавычки, он становится заголовком окна, а первый параметр в %my_params%становится командой . Чтобы быть в безопасности, используйте start "some title here" %my_command% %my_params%. Большинство просто используют ""и проклинают разработчика за то, что он не использует опцию /TITLEили /Tвместо того, чтобы установить заголовок.
ADTC
13

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

Мое последнее прозрение - это ловкость рук (или окно консоли), заменив один экземпляр 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

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

ViperGeek
источник
+1 Очень новаторский подход, и хотя я согласен, что это не точная замена, он работает хорошо (хотя вы действительно волновали меня, когда начинали свой пост с «замены cmd.exe» - сигналы безопасности звучали, пока я не добрался до примера и не понял, что ты имел ввиду)
Basic
вы должны использовать exit /bдля выхода из пакетного сценария
Себастьян Годеле
1
@SebastianGodelet: В общем, это хороший совет, но здесь мы действительно хотим закрыть (оригинальное) окно консоли , учитывая, что целевая команда запускается в новом окне.
mklement0
Зачем использовать «cmd / k» (держать переводчик открытым) вместо «/ c»? Просто чтобы увидеть вывод команды?
Рауль Салинас-Монтеагудо
9

Решение Gringo хорошо, но не работает со скриптами, которые передают список аргументов (т.е. python myscript.py %*), так SHIFTкак не обновляется %*. Есть обходные пути , но у них есть определенные ограничения.

Вот модификация, с которой я закончил:

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

99. (9)% безупречно.

Олег Еремеев
источник
Это не сработает, если вы myscript.pyхотите читать со стандартного ввода.
Джеймсдлин
0

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

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

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


источник
0

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


источник
0

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

Il Cognato
источник
2
Я думаю, что вы, возможно, имели в виду <nul (так как> nul отправляет все stdout на ноль).
Брайан Филлипс
0

Я столкнулся с этим с EXE-файлом, который, казалось, выдавал ^ C родительскому пакету при выходе, вызывая запрос «Завершить пакетное задание» даже при чистом выходе.

Решением, которое я выбрал, было запускать пакет с «Пуск», аналогично другим ответам, но из приглашения PowerShell (или, если хотите, с помощью метода интерпретатора PowerShell из CMD).

Сейчас 2018 год, и в Windows 10 Microsoft начала вытеснять CMD с PowerShell в качестве предпочтительной командной строки, поэтому по умолчанию она легко доступна в графическом интерфейсе.

Startэто псевдоним для Start-Process .

При запуске просто запускается и возвращается. Поэтому, когда вы останавливаете запущенный процесс, подсказка «Завершить пакетное задание» отсутствует.

По умолчанию он не ждет, поэтому никаких дополнительных аргументов помимо команды и ее аргументов не требуется.

Использование start mything.exe -mythings -argumentsв моей партии работало отлично.

В сценариях PowerShell должен быть указан путь к запуску, поэтому я запускаю свой командный файл как .\host.bat.

Ƭᴇcʜιᴇ007
источник
0

TCC / LE , который является бесплатной заменой CMD (воспринимается как CMD ++), имеет возможность подавить запрос на завершение пакетного задания. Вы можете найти эту опцию в диалоге настройки запуска TCC :

Отмена пакетного файла на Ctrl-C : Отмена обработки пакетного файла без обычной подсказки при нажатии Control-C.

Скриншот:

Варианты TCC / LE

Если вы никогда раньше не слышали о TCC / LE, вот несколько замечаний с сайта:

TCC / LE является заменой командной строки CMD (командная строка Windows по умолчанию). TCC / LE - это расширенный набор CMD с 111 внутренними командами (в CMD менее 40), 240 внутренними переменными и функциями и сотнями улучшений существующих команд CMD.

TCC / LE работает с вашими существующими приложениями командной строки и пакетными файлами, но предлагает значительные улучшения в возможностях командной строки и пакетных файлов и добавляет тысячи новых функций в окна командной строки.

Я использовал TCC / LE в течение многих лет и 4NT до этого. Я очень люблю это и могу рекомендовать это. Единственная причина, по которой я до сих пор не использую его, заключается в том, что я почти исключительно использую PowerShell сейчас.

Чарльз Ропер
источник
0

Основная причина подавления «Завершения пакетного задания (Y / N)» - запуск программы в цикле (например, повторный запуск в случае сбоя).

Это https://stackoverflow.com/a/8185270/1170023 помогло привести к этому решению:

@ECHO OFF
rem assumes you have installed pslist from sysinternals to windows PATH

:RUN
echo Starting GoldenEye Dedicated Server
start "" srcds.exe -console -game gesource +maxplayers 16 +map ge_complex

:LOOP
pslist srcds >nul 2>&1
if ERRORLEVEL 1 (
  goto RUN
) else (
  rem echo Dedicated server is still running
  timeout /t 5 >nul
  goto LOOP
)
kevinf
источник
-2

Самый простой способ подавить подтверждение, если вы используете Hyper- терминал, это добавить плагин Hyper- Yes.

Рики Бойс
источник
Почему отрицательный голос? Я обозначил, когда только с помощью Hyper. На самом деле это отличное решение, которое я использую при использовании Windows.
Рикки Бойс
1
Вопрос о cmd.exe.
Рауль Салинас-Монтеагудо
-3

В конце вашего сценария просто добавьте следующую команду:
echo
Это не «повредит» поведению вашего сценария, и, кажется, мешает CDM спросить, хотите ли вы прекратить пакет.

Henri
источник
5
Не работал для меня
Helgi