暂停期间中断批处理脚本的执行

暂停期间中断批处理脚本的执行

我正在开发一个复杂且长时间运行的批处理脚本,在调试时遇到了一个小问题。我打开了一个指向脚本根路径的命令行窗口,因此我可以键入内容来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

相关内容