当 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.