批处理脚本问题:扩展变量输入逻辑与添加倒计时显示
批处理脚本优化问题
当前使用的批处理代码
@echo off mode 62,22 :Begin choice /c 12345 /M "Insert a number (min. 1 - max. 5): " set "CommandVar0=%errorlevel%" choice /c 12345 /M "Please confirm the number you entered: " set "CommandVarC=%errorlevel%" if %CommandVarC% NEQ %CommandVar0% ( echo Insert a matching number between 1~5 for confirmation goto Begin ) if %CommandVar0% == 1 set /P CommandVar1=Insert ID: if %CommandVar0% == 2 set /P CommandVar1=Insert ID: & set /P CommandVar2=Insert ID: if %CommandVar0% == 3 set /P CommandVar1=Insert ID: & set /P CommandVar2=Insert ID: & set /P CommandVar3=Insert ID: if %CommandVar0% == 4 set /P CommandVar1=Insert ID: & set /P CommandVar2=Insert ID: & set /P CommandVar3=Insert ID: & set /P CommandVar4=Insert ID: if %CommandVar0% == 5 set /P CommandVar1=Insert ID: & set /P CommandVar2=Insert ID: & set /P CommandVar3=Insert ID: & set /P CommandVar4=Insert ID: & set /P CommandVar5=Insert ID: :loop start EXAMPLE.exe %CommandVar1% if defined commandvar2 start EXAMPLE.exe %CommandVar2% if defined commandvar3 start EXAMPLE.exe %CommandVar3% if defined commandvar4 start EXAMPLE.exe %CommandVar4% if defined commandvar5 start EXAMPLE.exe %CommandVar5% rem wait 10 seconds for /L %%y in (1,1,10) do ( timeout /t 1 > nul tasklist /fi "imagename eq EXAMPLE.exe" |find ":" > nul if NOT errorlevel 1 goto begin ) taskkill /f /im EXAMPLE.exe timeout /t 5 goto loop
遇到的两个问题
问题1:扩展变量输入验证到CommandVar5
目前仅能验证到CommandVar2,代码如下,无法直接扩展支持5个变量的验证:
set "commandvar1=" set "commandvar2=" set /P CommandVar1=Insert ID: if not defined commandvar1 goto begin if "%CommandVar0%"=="2" ( set /P CommandVar2=Insert ID: if not defined commandvar2 goto begin )
问题2:给循环等待代码添加倒计时显示
现有循环等待代码无倒计时提示,希望实现类似timeout /t命令的倒计时显示效果:
for /L %%y in (1,1,10) do ( timeout /t 1 > nul tasklist /fi "imagename eq EXAMPLE.exe" |find ":" > nul if NOT errorlevel 1 goto begin )
解决方案
针对问题1:用循环简化输入验证逻辑
通过for /L循环根据用户选择的数字(CommandVar0)批量处理ID输入与验证,避免重复代码:
:Begin choice /c 12345 /M "输入数字(1-5): " set "CommandVar0=%errorlevel%" choice /c 12345 /M "请确认输入的数字: " set "CommandVarC=%errorlevel%" if %CommandVarC% NEQ %CommandVar0% ( echo 请输入匹配的1~5数字进行确认 timeout /t 2 > nul goto Begin ) :: 重置所有ID变量 for /L %%i in (1,1,5) do set "CommandVar%%i=" :: 循环获取并验证ID输入 for /L %%i in (1,1,%CommandVar0%) do ( :InputID%%i set /P "CommandVar%%i=输入第%%i个ID: " if not defined CommandVar%%i ( echo ID不能为空,请重新输入 timeout /t 1 > nul goto InputID%%i ) )
这段代码会根据用户选择的数量,循环要求输入对应个数的ID,每个ID都会做非空校验,输入为空时会提示重新输入。
针对问题2:添加倒计时显示功能
修改循环等待代码,通过计算剩余时间并实时输出,实现倒计时效果:
rem 等待10秒并显示倒计时 set "WaitTime=10" for /L %%y in (%WaitTime%,-1,1) do ( cls echo 等待进程结束,剩余时间: %%y秒... timeout /t 1 > nul :: 检查EXAMPLE.exe是否仍在运行 tasklist /fi "imagename eq EXAMPLE.exe" |find ":" > nul if NOT errorlevel 1 goto begin )
每次循环会清屏并显示最新的倒计时,确保界面整洁;如果不想清屏,也可以用覆盖当前行的方式实现:
set "WaitTime=10" for /L %%y in (%WaitTime%,-1,1) do ( <nul set /p "=剩余等待时间: %%y秒... " timeout /t 1 > nul echo. tasklist /fi "imagename eq EXAMPLE.exe" |find ":" > nul if NOT errorlevel 1 goto begin )
优化后的完整脚本
@echo off mode 62,22 :Begin choice /c 12345 /M "输入数字(1-5): " set "CommandVar0=%errorlevel%" choice /c 12345 /M "请确认输入的数字: " set "CommandVarC=%errorlevel%" if %CommandVarC% NEQ %CommandVar0% ( echo 请输入匹配的1~5数字进行确认 timeout /t 2 > nul goto Begin ) :: 重置所有ID变量 for /L %%i in (1,1,5) do set "CommandVar%%i=" :: 循环获取并验证ID输入 for /L %%i in (1,1,%CommandVar0%) do ( :InputID%%i set /P "CommandVar%%i=输入第%%i个ID: " if not defined CommandVar%%i ( echo ID不能为空,请重新输入 timeout /t 1 > nul goto InputID%%i ) ) :loop :: 启动对应数量的EXAMPLE.exe for /L %%i in (1,1,%CommandVar0%) do start EXAMPLE.exe !CommandVar%%i! :: 等待10秒并显示倒计时 set "WaitTime=10" for /L %%y in (%WaitTime%,-1,1) do ( cls echo 等待进程结束,剩余时间: %%y秒... timeout /t 1 > nul :: 检查是否还有EXAMPLE.exe在运行 tasklist /fi "imagename eq EXAMPLE.exe" |find ":" > nul if NOT errorlevel 1 goto begin ) :: 强制结束所有EXAMPLE.exe进程 taskkill /f /im EXAMPLE.exe echo 已结束所有EXAMPLE.exe进程,5秒后重新开始... timeout /t 5 > nul goto loop
内容的提问来源于stack exchange,提问作者user12261902
相关产品推荐
相关产品推荐

