Как отключить подтверждение завершения пакетного задания Windows?

Как отключить подтверждение завершения пакетного задания Windows?

Когда пакетное задание 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.

Связанный контент