как отменить подтверждение "завершить пакетное задание (y/n)"?

<p>в cmd, когда мы нажимаем ctrl + c, мы завершаем работу целевого приложения, но если целевое приложение вызывается из пакетного файла, мы получаем это подтверждение «завершить пакетное задание (y/n)». я никогда не могу вспомнить случай, когда я решил не прерывать пакетное задание. как мы можем пропустить это подтверждение?</p>

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

<p>нажмите <kbd>ctrl</kbd>+<kbd>c</kbd> дважды.</p>

<p>на этом <a href="http://mythinkpond.wordpress.com/2011/06/24/tired-of-terminate-batch-job-yn-try-this/">сайте</a> я нашел эффективное решение:</p><pre><code>script2.cmd < nul </code></pre><p>чтобы не приходилось печатать это каждый раз, я сделал второй скрипт с именем <code>script.cmd</code> в той же папке, что и строка выше. я тестировал эту технику только на xp, но другие подтвердили ее на win 7.</p><p>натан добавляет: другой вариант - поместить следующий код в начало файла script.cmd, который делает то же самое в одном файле:</p><pre><code>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 ) </code></pre>

<p>установите <a href="http://mridgers.github.io/clink/">clink</a> и измените настройку terminate\_autoanswer. файл настроек <a href="https://github.com/mridgers/clink/blob/master/docs/clink.md#file-locations">должен быть здесь</a> : <code>c:\users\<username>\appdata\local\clink\settings</code>.</p><pre><code># 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 </code></pre><p>это тогда "просто работает" с любым окном cmd.exe. вам не нужно изменять то, что работает или что-то иное, так как кликните копилки на cmd.exe.</p><p>черт возьми, имо!</p>

<p>если вам не нужно ничего делать в пакетном файле после нормального завершения приложения, то с помощью команды <a href="http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/start.mspx?mfr=true"><code>start</code></a> убедитесь, что пакетный файл уже завершен к тому времени, когда вы нажмете ctrl-c. и, следовательно, сообщение не появится.</p><p>например:</p><pre>@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 </pre><p>(проверено на windows xp.)</p>

<p>я боролся с этим желанием избежать "завершить пакетное задание" на некоторое время.</p><p>мое последнее прозрение - это ловкость рук (или окно консоли), заменив один экземпляр <code>cmd.exe</code> другим. это достигается путем выполнения команды/программы через <code>start cmd /k</code>, за которым сразу следует <code>exit</code> в файле <code>.bat</code>.</p><p>исходное окно консоли исчезает, а замену можно чисто остановить с помощью <kbd>ctrl</kbd>-<kbd>c</kbd>,.</p><p>рассмотрим следующий пример <code>traceroute</code>, который может быть прерван <kbd>ctrl</kbd>+<kbd>c</kbd>или разрешено завершить, возвращая пользователя в подсказку <code>c:\></code>:</p><pre><code>@echo off set timeout=100 if not "%2"=="" set timeout=%2 start cmd /k tracert -w %timeout% %1 exit </code></pre><p>замена окружения на новый командный интерпретатор может быть не для всех, но, на мой взгляд, выглядит и работает хорошо для меня.</p>

<p>решение gringo хорошо, но не работает со скриптами, которые передают список аргументов (т.е. <code>python myscript.py %*</code>), так как <code>shift</code> не обновляет <code>%*</code>. есть <a href="https://stackoverflow.com/questions/9363080/how-to-make-shift-work-with-in-batch-files">обходные пути</a> , но у них есть определенные ограничения.</p><p>вот модификация, с которой я закончил:</p><pre><code>if [%justterminate%] == [okay] ( set justterminate= python myscript.py %* ) else ( set justterminate=okay call %0 %* <nul ) </code></pre><p>99. (9)% безупречно.</p>

<p>смотрите <a href="https://stackoverflow.com/questions/1234571/how-can-i-suppress-the-terminate-batch-job-in-cmd-exe">этот вопрос переполнения стека</a> .</p><p>тем не менее, исправление cmd.exe не то, что я бы сделал для этого.</p>

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

<p>я столкнулся с этим с exe-файлом, который, казалось, выдавал ^ c родительскому пакету при выходе, вызывая запрос «завершить пакетное задание» даже при чистом выходе.</p><p>решением, которое я выбрал, было запускать пакет с «пуск», аналогично другим ответам, но из подсказки powershell (или через метод интерпретатора powershell из cmd, если вы выберете).</p><p>сейчас 2018 год, и в windows 10 microsoft начала вытеснять cmd с powershell в качестве предпочтительной командной строки, поэтому по умолчанию она легко доступна в графическом интерфейсе.</p><p><code>start</code> является псевдонимом для <a href="https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/start-process">start-process</a> .</p><p>при запуске просто запускается и возвращается. поэтому, когда вы останавливаете запущенный процесс, нет запроса «завершить пакетное задание».</p><p>по умолчанию он не ждет, поэтому никаких дополнительных аргументов помимо команды и ее аргументов не требуется.</p><p>использование <code>start mything.exe -mythings -arguments</code> в моей партии работало отлично.</p><p>в сценариях powershell должен быть указан путь к запуску, поэтому я запускаю свой командный файл как <code>.\host.bat</code>.</p>

<p>основная причина подавления «завершения пакетного задания (y/n)» - запуск программы в цикле (например, повторный запуск в случае сбоя).</p><p>это <a href="https://stackoverflow.com/a/8185270/1170023">https://stackoverflow.com/a/8185270/1170023</a> помогло привести к этому решению:</p><pre><code>@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 ) </code></pre>

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

<p>в моем случае именно файл ping.bat, который находился прямо в моем пользовательском каталоге (c:\users\в vista или c:\documents and settings\в xp), неопределенно удерживал пакетное задание.</p><p>этот пакетный файл выполнялся всякий раз, когда я запускал ping из командной строки, где текущим каталогом является мой пользовательский каталог. пинг из окна «выполнить» или из каталога другого пользователя работал нормально.</p><p>удалил файл из моего пользовательского каталога, и проблема была решена!</p>

<p> <a href="https://jpsoft.com/products/tcc-le.html">tcc/le</a> , которая является свободной заменой cmd (воспринимается как cmd ++), имеет возможность подавить запрос на завершение пакетного задания. вы можете найти опцию в <a href="https://jpsoft.com/help/index.htm?inistartupdlg.htm">диалог конфигурации запуска tcc</a> :</p><blockquote> <p><strong> отменить пакетный файл с помощью ctrl-c </strong>: отменить обработку пакетного файла без обычной подсказки при нажатии control-c.</p> </blockquote><p>скриншот:</p><p> <a href="https://i.stack.imgur.com/d2ujm.png"> <img src="https://i.stack.imgur.com/d2ujm.png" alt="tcc/le options"> </a> </p><p>если вы никогда раньше не слышали о tcc/le, вот несколько замечаний с сайта:</p><blockquote> <p>tcc/le является заменой командной строки cmd (командная строка windows по умолчанию). tcc/le - это расширенный набор cmd с 111 внутренними командами (в cmd менее 40), 240 внутренними переменными и функциями и сотнями улучшений существующих команд cmd.</p> <p>tcc/le работает с вашими существующими приложениями командной строки и пакетными файлами, но предлагает значительные улучшения в возможностях командной строки и пакетных файлов и добавляет тысячи новых функций в окна командной строки.</p> </blockquote><p>я использовал tcc/le в течение многих лет и 4nt до этого. я очень люблю это и могу рекомендовать это. единственная причина, по которой я до сих пор не использую его, заключается в том, что я почти исключительно использую powershell сейчас.</p>