141

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

16 ответов16

56

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

47

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

46

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

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
)
23

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

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

17

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

Например:

@echo off

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

echo Command to be executed by 'start': %my_command% %my_params%

:: When NOT using /B or /WAIT then this will create a new window, while
:: execution of this very batch file will continue in the current window:

start %my_command% %my_params%

echo.
echo This line will be executed BEFORE 'start' is even finished. So, this
echo batch file will complete BEFORE one presses Ctrl-C in the other window.
echo.

:: Just for testing use 'pause' to show "Press any key to continue", to see
:: the output of the 'echo' commands. Be sure to press Ctrl-C in the window
:: that runs the 'ping' command (not in this very window). Or simply remove
:: the next line when confused:

pause

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

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

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

7

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

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

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

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

4

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

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

0

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

0

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

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

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

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

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

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

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

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

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
)
0

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

0

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

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

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

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.

-1

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

-2

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .