it-swarm-ru.tech

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

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

146
Srikanth

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

47
BinaryMisfit

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

57
Kirill V. Lyadvinsky

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

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
)
54
Gringo Suave

Установите 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.

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

26
Macke

Если вам не нужно ничего делать в пакетном файле после нормального завершения приложения, то с помощью команды 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 Эта строка будет выполнена ДО «начало» даже закончено. Таким образом, этот 
 Эхо-пакетный файл будет завершен ДО того, как вы нажмете Ctrl-C в другом окне. 
 Эхо. 
 
 :: Только для тестирования используйте «пауза» чтобы показать «Нажмите любую клавишу для продолжения», чтобы увидеть 
 :: вывод команд 'echo'. Обязательно нажмите Ctrl-C в окне 
 ::, которое запускает команду «ping» (не в этом самом окне). Или просто удалите 
 :: следующую строку, если запутано: 
 
 Pause 

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

17
sgmoore

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

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

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

13
ViperGeek

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

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

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

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

7
Olegs Jeremejevs

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

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

4
Joey

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

0
user31480

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

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

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

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

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

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

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

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

0
Ƭᴇcʜιᴇ007

Основная причина подавления «Завершения пакетного задания (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
kevinf

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

0
Il Cognato

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

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

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

0
bonipet

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

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

Скриншот:

 TCC/LE options

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

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

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

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

0
Charles Roper