Як придушити підтвердження "Закінчити пакетну роботу (Y / N)"?


153

У cmd, коли ми натискаємо Ctrl + C, ми припиняємо цільову програму, але якщо цільова програма викликається з пакетного файлу, ми отримуємо це підтвердження "Закінчити пакетне завдання (Y / N)" ". Я ніколи не можу згадати приклад, коли я вирішив не припиняти пакетну роботу. Як ми можемо пропустити це підтвердження?


Ви коли-небудь пробували відповідь sgmoore? superuser.com/questions/35698/…
Арджан

10
"Я ніколи не можу згадати приклад, коли я вирішив не припиняти пакетну роботу". І насправді, у більшості випадків робота припиняється, навіть якщо ви відповісте ні ...
PhiLho

@PhiLho - Це не може бути правдою, оскільки мої сценарії завжди продовжуються після входу N. Мені цікаво, який у вас сценарій, коли закінчується пакетний сценарій після введення N.
dbenham

Я сподівався, що це буде легко, але, як завжди, Microsoft завдала чогось простого болю в попці. Відповіді, наведені нижче, все витрачають занадто багато зусиль, щоб уникнути цього незначного роздратування. Мені просто прикро, що немає простого способу вирішити це. Серйозно, Microsoft, в чому сенс цієї підказки? Так, я впевнений, тому я потрапив у Ctrl + C ...
Шев

Ця проблема, принаймні, змушує мене згадувати і частіше використовувати -nперемикач для cygwin ping .
palswim

Відповіді:


53

AFAIK ви не можете, оскільки така поведінка є дизайном і контролюється інтерпретатором команд. Не існує методу "відображення" або навіть "перехоплення" цього, якщо ви не декомпілюєте та не перекомпілюєте перекладача безпосередньо.


39
Це розчаровує :(
Шрікант,

Так, це невтішно. Що ще більше розчаровує, що команда BREAK, яка за замовчуванням не робить нічого під XP, могла бути використана для перемикання підказки…
Synetech

3
Хоча це може бути правдою, не можна змусити перекладача поводитись інакше, але використання startsgmoore, запропонованого на superuser.com/questions/35698/…, здається мені прекрасним вирішенням.
Ар’ян


57

Натисніть Ctrl+ Cдвічі.


5
Це не спрацює, а скоріше повторить підказку.
Joey

8
Я просто вбив свою базу даних, зробивши це! Сценарій чекав на "паузу", тому я зробив CTRL-C, а потім з'явилася підказка, тому я знову зробив CTRL-C, а потім пакетний файл невдоволено продовжив і видалив мою базу даних! @see superuser.com/questions/740004/…
Себастьян Діот

2
Це не те, що запитувала ОП. Він міг так само легко набрати "N" після ^ С.
vladr

3
@vladr нескінченно простіше утримувати Ctrlта натискати Cзнову проти удару Yпотім Enter.
Нік Т

20
@SebastienDiot Ви випробували нову техніку сценарію, яка могла назавжди знищити дані? Ось ... Хоробрий.
Основні

57

На цьому сайті я знайшов ефективне рішення:

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
Він працює, якщо вам не потрібен ввід користувача в пакеті.
Augusto Men

2
@William, просто називаючи сценарій не працює для мене, але я придумав обхідний шлях: @IF ""=="%1" (@%0 CALLED < nul) ELSE (@[your command]). Закликає себе рекурсивно, але з аргументом вдруге. Якщо у вашого сценарію є аргументи, ви потенційно можете використовувати перший невикористаний позиційний аргумент. Це може бути проблематично, якщо ваш сценарій має багато аргументів. Мій сценарій не потребував аргументів або введення користувачем.
jpmc26

Відповідь jpmc працювала на мене. Це перегукується із Прокляттям Закінчення (у / п)? повідомлення в кінці тоді хоч, але не зупиняється на цьому.
ggb667

28

Встановіть Clink та змініть налаштування "endinate_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.

Frickin 'awesome, IMO!


Клінк - це фантастично, але це не працює для мене, використовуючи cmd.exe або Console2. Він все ще запитує, і він не заповнюється автоматично.
іоно

@tometoftom: Ви змінили файл налаштувань, як зазначено вище? Мені довелося це зробити, щоб він працював. (Зверніть увагу, що ви повинні бути адміністратором, щоб правильно зберегти файл у Windows Vista та вище ...)
Macke

3
Ах, досі жодної кістки. глибокий зітхання Microsoft, заради Бога ...
iono

3
@iono у вас не-англійська версія Windows? У цьому випадку клік не міг автоматично відповісти на запит до випуску 0.4.3 кілька днів тому: github.com/mridgers/clink/releases/tag/0.4.3
schlamar

3
Пов’язано: для тих, хто використовує cmder , налаштування увімкнено \cmder\config\settings. Дивіться проблему, пов’язану тут, github.com/cmderdev/cmder/isissue/1666
edmundo096

17

Якщо вам не потрібно нічого робити в пакетному файлі після того, як ваша програма закінчиться нормально, то за допомогою startкоманди гарантується, що пакетний файл вже закінчений до моменту натискання клавіші Ctrl-C. А значить, повідомлення не з’явиться.

Наприклад:

@echo off

встановити my_command = ping.exe
встановити my_params = -t www.google.com

команда echo, яку слід виконати 'start':% my_command%% my_params%

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

start% my_command%% my_params%

відлуння.
echo Цей рядок буде виконаний до того, як «старт» навіть буде закінчений. Отже, це
Пакетний файл ехо завершиться, перш ніж один натисне Ctrl-C в іншому вікні.
відлуння.

:: Тільки для тестування використовуйте "паузу", щоб показати "Натисніть будь-яку клавішу для продовження", щоб побачити
:: вихід команд 'echo'. Не забудьте натиснути Ctrl-C у вікні
::, яка виконує команду 'ping' (не в цьому самому вікні). Або просто видалити
:: наступний рядок, коли плутають:

пауза

(Тестовано на Windows XP.)


Я не знаю, чи startсправді це допомогло б, але це звучить правдоподібно для мене. Тож мені цікаво, чи має на увазі те, що НУВ не працює? А може хто, хто прихильнився, не знає команди Windows start(або особливо start /waitі start /b)? Дивіться microsoft.com/resources/documentation/windows/xp/all/proddocs/… потім. Поясніть, будь ласка, протокол?
Ар'ян

startне буде працювати. Щоразу, коли cmd запускає пакетний файл, натискання Ctrl + C призведе до припинення поточного запущеного процесу та відобразить питання.
Joey

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

Заміна оточення нового інтерпретатора команд може бути не для всіх, але неозброєним оком для мене виглядає і працює добре.


+1 Дуже новий підхід, і хоча я згоден, ти не є точною заміною, він працює добре (хоча ти мене хвилював, коли ти почав свою посаду із "заміни cmd.exe" - сигнали тривоги, доки я не дійшов до прикладу і не зрозумів що ви мали на увазі)
Основні

вам слід скористатися 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хоче читати з stdin.
jamesdlin


0

У моєму випадку саме файл ping.bat знаходився прямо в моєму каталозі користувачів (C: \ Користувачі \ у Vista або C: \ Документи та налаштування \ в XP), який займав пакетне завдання невизначено.

Цей пакетний файл виконувався щоразу, коли я запускав ping з командного рядка, де поточний каталог є моєю каталогом користувачів. Ping-ing у вікні «Запустити» або з каталогу інших користувачів працював добре.

Видалено файл з мого користувача dir, і проблема була вирішена!


0

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


0

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


2
Я думаю, ви, можливо, мали на увазі <nul (оскільки> nul посилає всі stdout до null).
Брайан Філліпс

0

Я наткнувся на це з EXE, який, здавалося, кинув ^ C до батьківської партії при виході, викликаючи підказку «Закінчити пакетну роботу» навіть при чистому виході.

Я вирішив скористатись рішенням: запустити пакет із "Пуском", аналогічно іншим відповідям, але з підказки PowerShell (або за вибором методу інтерпретатора PowerShell від CMD).

Зараз 2018 рік, і в Windows 10 Microsoft почала витісняти CMD з PowerShell як найкращою командною командою, тому вона доступна у графічному інтерфейсі за замовчуванням.

Startє псевдонімом Start-Process .

Під час запуску він просто запускається та повертається. Тож, коли ви зупиняєте запущений процес, немає запиту "Завершити пакетну роботу".

За замовчуванням він не чекає, тому додаткові аргументи поза командою та його аргументами не потрібні.

Використання start mything.exe -mythings -argumentsв моїй партії спрацювало чудово.

У сценаріях PowerShell повинен передувати їх шлях до запуску, тому я запускаю пакетний файл як .\host.bat.


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
)

-2

Найпростіший спосіб придушити підтвердження, якщо ви використовуєте Hyper- термінал, - це додати плагін гіпер-так .


Чому потік? Я позначав лише при використанні Hyper. Насправді це чудове рішення, яке я використовую під час використання Windows.
Рікі Бойс

1
Питання про cmd.exe.
Рауль Салінас-Монтеагудо

-3

В кінці вашого сценарію просто додайте таку команду:
echo
Це не "пошкодить" поведінку вашого сценарію, і, здається, заважає CDM запитати, чи хочете ви припинити пакет.


5
Не працювало для мене.
Хелгі
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.