如何抑制 Windows 批处理作业终止确认?

如何抑制 Windows 批处理作业终止确认?

当 Windows 批处理作业启动了一个程序(可执行)时,用户可以按 Ctrl-C 来停止该程序。

这会导致 Windows 批处理作业显示“终止批处理作业 (Y/N)”提示并等待按键。

我怎样才能抑制这个提示并避免按任意键?

答案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.

相关内容