我正在开发一个复杂且长时间运行的批处理脚本,在调试时遇到了一个小问题。我打开了一个指向脚本根路径的命令行窗口,因此我可以键入内容来myscript.bat
启动它进行测试。我PAUSE
在语句之间使用命令来观察脚本的行为。但是,我发现在PAUSE
命令取消执行期间键入 CTRL+C 只会被解释为继续执行的键,而不是按预期中断脚本。
我知道我可以简单地关闭命令窗口,但每次都要在新的命令窗口中导航回正确的路径,这有点烦人。有没有办法在批处理脚本当前处于 时轻松地正确中断其执行PAUSE
?
编辑:PAUSE
正如@dbenham 所指出的,它在简单的脚本中似乎运行良好。但是,如果在迭代PAUSE
中嵌套了多个语句FOR
,则不能在迭代中间中断FOR
- 只能在结束时中断。以下是演示此问题的示例脚本:
@echo off
for /l %%y in (2008, 1, 2013) do (
echo 1
pause
echo 2
pause
echo 3
pause
echo 4
pause
echo 5
pause
)
如果您尝试终止前四个PAUSE
语句中的任何一个,您会发现您的终止命令被忽略,并且执行仍然继续。但是一旦您到达末尾,即第五个PAUSE
,您就会得到终止提示(在下面的示例输出中,我在每个提示符下都按 CTRL+C):
Z:\>test
1
Press any key to continue . . .
2
Press any key to continue . . .
3
Press any key to continue . . .
4
Press any key to continue . . .
5
Press any key to continue . . .
Terminate batch job (Y/N)? y
有什么想法可以防止这种行为吗?
答案1
我在 Win 7 (32 位) 上运行良好
这是一个简单的测试脚本
@echo off
echo Before
pause
echo After
当我在不按 的情况下运行上述操作时<Ctrl-C>
,我得到以下结果:
D:\test>test
Before
Press any key to continue . . .
After
D:\test>
当我按下<Ctrl-C>
“按任意键”提示时,我得到:
D:\test>test
Before
Press any key to continue . . .
Terminate batch job (Y/N)? y
D:\test>
编辑:后续问题的解决方案
它不需要在循环中。任何带括号的代码块都存在问题。整个块一次性解析,然后从内存中执行。
(
echo Before 1
pause
echo Before 2
pause
echo After
)
我认为使用 PAUSE 命令无法解决问题。但我有一个简单的解决方案,应该可以提供您想要的调试功能。只需确保在运行脚本之前尚未定义 PAUSE 环境变量即可。
@echo off
:: ------------------------------------------------------
:: Include this block of code at the top of your script
::
setlocal
if not defined pause (
set "pause=choice /m "........................Continue "&if errorlevel 2 exit"
cmd /c ^""%~f0" %* ^"
exit /b
)
:: ------------------------------------------------------
:: Now use %pause% instead of pause anywhere you want within your script
:: Press Y to continue, N to quit
:: The script will immediately terminate if you press N, even if in the
:: middle of a CALL
:: Here is a simple demonstration
call :sub1
exit /b
:sub1
call :sub2
exit /b
:sub2
for /l %%N in (1 1 3) do (
echo ----- %%N ------
echo Before 1
%pause%
echo Before 2
%pause%
echo After
)
exit /b
答案2
解决括号块问题的一种方法PAUSE
是调用子程序:
@echo off
goto run
:pause
echo %*
pause >nul
exit /b
:run
(
echo Before 1
call :pause Please consider aborting with Ctrl+C
echo Before 2
call :pause Really consider aborting with Ctrl+C
echo After
)
这至少解决了 Windows 10 中的问题,并允许自定义消息PAUSE
。