![Как отключить подтверждение завершения пакетного задания Windows?](https://rvso.com/image/1665763/%D0%9A%D0%B0%D0%BA%20%D0%BE%D1%82%D0%BA%D0%BB%D1%8E%D1%87%D0%B8%D1%82%D1%8C%20%D0%BF%D0%BE%D0%B4%D1%82%D0%B2%D0%B5%D1%80%D0%B6%D0%B4%D0%B5%D0%BD%D0%B8%D0%B5%20%D0%B7%D0%B0%D0%B2%D0%B5%D1%80%D1%88%D0%B5%D0%BD%D0%B8%D1%8F%20%D0%BF%D0%B0%D0%BA%D0%B5%D1%82%D0%BD%D0%BE%D0%B3%D0%BE%20%D0%B7%D0%B0%D0%B4%D0%B0%D0%BD%D0%B8%D1%8F%20Windows%3F.png)
Когда пакетное задание Windows запустило программу (исполняемый файл), пользователь может нажать Ctrl-C, чтобы остановить программу.
Это приводит к тому, что пакетное задание Windows выводит на экран запрос «Завершить пакетное задание (Д/Н)» и ждет нажатия клавиш.
Как можно отключить эту подсказку и необходимость нажимать какую-либо клавишу?
решение1
Расширяя предложение @KTaTk, если вы затираете код возврата в условном выражении, это подавит запрос «Завершить пакетное задание (Y/N)».
Мой обходной путь:
setlocal enabledelayedexpansion
program.exe & set SAVEDRC=!ERRORLEVEL! & call;
echo Return Code was %SAVEDRC%
exit /b %SAVEDRC%
!ERRORLEVEL!
Обратите внимание, что для получения значения в том же составном операторе необходимо использовать (отложенное расширение), поскольку %ERRORLEVEL%
(расширение во время синтаксического анализа) не отражает обновленный код возврата из программы.
Затем call;
функция сбрасывает уровень ошибки до 0 перед выполнением следующей строки.
Наконец (необязательно) мы выходим с сохраненным кодом возврата. Если это -1073741510 ( STATUS_CONTROL_C_EXIT
) и родительский процесс также является cmd shell, то родительский процесс покажет эту подсказку.
В качестве альтернативы, похоже, приглашение ctrl-c появляется только в том случае, если код возврата другого процесса вызывает этот код выхода. Поэтому созданиефункциякоторый просто завершает работу без изменения ERRORLEVEL, также подавляет подсказку:
program.exe & call:ignoreCtrlC
echo Return Code was %ERRORLEVEL%
goto:eof
:ignoreCtrlC
exit /b
решение2
Вы можете использоватьусловное исполнениев команде, запускающей исполняемый файл:
my_executable.exe && exit 0 || exit 1
Это подавляет любые запросы и завершает пакетное задание с кодом 0 или 1, в зависимости от кода выхода исполняемого файла.
Это работает как для Ctrl-C, так и для Ctrl-Break.
решение3
Учитывая, что CTRL-BREAK или CTRL-C уже являются нажатием клавиши, вы, возможно, ищете ответ, который останавливает пакетный скрипт без необходимости нажимать CTRL-C или CTRL-BREAK.
Этот ответ на тот случай, если это и есть ваша цель.
В пакетной обработке вы можете использовать метки и операторы IF для перемещения по скрипту.
Например:
@echo off
:: -- Lets print something to the screen.
echo This is a test before the loop starts
:: -- Lets set a counter variable to 0, just to be sure.
set counter=0
:: -- Set loop beginning point
:begin
:: -- Increase the counter by one but don't display the result to the screen
set /a counter=counter+1 >nul
:: -- now, write it to the screen our way.
echo Progress: %counter% of 10
:: -- pause the script for a second but without any displaying...
ping localhost -n 2 >nul
:: -- see if we reached 10, if so jump to the exit point of the script.
if %counter%==10 goto exit
:: -- if we reached this point, we have not jumped to the exit point.
:: -- so instead, lets jump back to the beginning point.
:: -- identation is used so the loop clearly stands out in the script
goto begin
:: -- set exit point for this script
:exit
:: -- lets print a message. We don't have to, but its nice, right?
echo End of the script has been reached.
Это даст следующий вывод, предполагая, что мы написали c:\temp\counter.cmd:
c:\temp>counter
This is a test before the loop starts
Progress: 1 of 10
Progress: 2 of 10
Progress: 3 of 10
Progress: 4 of 10
Progress: 5 of 10
Progress: 6 of 10
Progress: 7 of 10
Progress: 8 of 10
Progress: 9 of 10
Progress: 10 of 10
End of the script has been reached.