如何使用特定的键输入中断 CMD 批处理文件中的循环?

How can I interrupt a loop in CMD batch file using a specific key input?

这是整个想法: 我有一个菜单可以在批处理文件中测试 ping 不同的 DNS 服务器,如下所示:

:MainMenu
ECHO 1. DNS Server 1
ECHO 2. DNS Server 2

现在,当用户选择上述选项之一时,进程开始 ping 所选服务器,在这种情况下,我使用 google DNS 8.8.8.8 :

:loopStarter
ECHO ***AUTO PING MODE IS ENABLED***
ECHO Pinging...
ping 8.8.8.8

CLS

GOTO loopStarter

如您所见,这组代码创建了一个循环并且 pings 服务器永不停止,

然而

我想通过输入一个键(任意键)将我带回 :MainMenu

来停止循环

===========

我已经看到并测试了很多答案,例如 Here 但不幸的是,我不理解代码或者它与我的问题无关。

如果有人能指导我,我将不胜感激。

一个简单的并行线程示例。
:key_detector 线程等待一个键,然后删除 notification_file.
:ping_test 执行 ping,然后检查 notification_file 是否存在,如果它仍然存在,将重复循环。

线程由管道的两个子实例启动。
这个看起来有点复杂,因为不能直接在pipe里面调用label,它只是启动自己的程序,一开始使用trampoline跳转到label。

@echo off
REM *** This is a trampoline to jump to a function when a child process shall be invoked
for /F "tokens=3 delims=:" %%L in ("%~0") do goto %%L

set "notification_file=%temp%\keypress.tmp"

echo dummy > "%notification_file%"
call "%~d0\:key_detector:\..%~pnx0" | call "%~d0\:ping_test:\..%~pnx0"
exit /b


:ping_test
ping -n 2 8.8.8.8 
if not exist "%notification_file%" exit /b
goto :ping_test

:key_detector
for /F "tokens=1 skip=1 eol=" %%C in ('"replace /w ? . < con"') do @(
    set "key=%%C"
    del %notification_file%
)

exit /b

基于这里找到的创建一个dynamic menu的方法,你可以创建类似的东西:


@echo off
:menuLOOP
Title Pinging some DNS
Color 9E & Mode 80,15
::===========================================================================
echo(
echo(
echo(       ***************************** Menu ******************************
echo(
@for /f "tokens=2* delims=_ " %%A in ('"findstr /b /c:":menu_" "%~f0""') do (
echo            %%A  %%B)
echo(
echo(       *****************************************************************
echo( Make A Selection And Hit ENTER to Ping or simply hit ENTER to quit:
Set /p Selection= || GOTO :EOF
echo( & call :menu_[%Selection%]
GOTO:menuLOOP
::===========================================================================
:menu_[1] Ping DNS Server 1
Cls
ECHO( Pinging...
ping 8.8.8.8
echo( & echo( Type any key to return to the Main Menu
pause>nul
Goto:menuLoop
::---------------------------------------------------------------------------
:menu_[2] Ping DNS Server 2
Cls
ECHO( Pinging...
ping 8.8.4.4
echo( & echo( Type any key to return to the Main Menu
pause>nul
Goto:menuLoop
::---------------------------------------------------------------------------