Board logo

标题: [已解决]批处理如何实现在倒计时结束前按任意键退出? [打印本页]

作者: AnyName    时间: 2009-4-8 18:42     标题: [已解决]批处理如何实现在倒计时结束前按任意键退出?

比如下面的代码,是显示一个10秒的倒计时,然后程序自动退出。
有没有什么办法,可以在倒计时结束前,按任意键就使程序退出呢?
  1. @echo off
  2. Set TT=10
  3. :count
  4. cls&echo 设置成功! %TT%秒后自动退出
  5. IF %TT%==0 exit
  6. set var=%time:~7,1%
  7. :loop
  8. set num=%time:~7,1%
  9. if %var%==%num% (goto loop) else (set var=%time:~7,1%)
  10. set /a TT-=1
  11. goto count
复制代码


P.S. 别告诉我可以点窗口上方的关闭按钮啊 = =!

[ 本帖最后由 AnyName 于 2009-4-9 13:43 编辑 ]
作者: BBCC    时间: 2009-4-8 20:01

choice?
还是多线程?
别告诉我可以点窗口上方的关闭按钮啊 = =!
就这个也行嘛...
作者: batman    时间: 2009-4-8 20:52

基本可以做到,但要用到choice.exe
http://bbs.bathome.net/viewthread.php?tid=2245&highlight=choice

[ 本帖最后由 batman 于 2009-4-8 20:54 编辑 ]
作者: more    时间: 2009-4-9 00:22

利用双进程可以实现:
  1. @echo off
  2. if not "%1"=="" goto %1
  3. del "%temp%\#" 2>nul
  4. start /b %~fs0 :aa
  5. :agn
  6. set/p=按任意键退出...<nul&pause>nul
  7. >"%temp%\#" type nul
  8. exit
  9. :aa
  10. for /l %%a in (10 -1 1) do (
  11.    title 倒计时 %%a 秒后自动退出...
  12.    if exist "%temp%\#" (
  13.       del "%temp%\#"
  14.       exit
  15.    )
  16.    ping -n 2 127.1>nul
  17. )
  18. title 自动退出...
  19. for /f "tokens=2" %%a in ('tasklist /fi "windowtitle eq 自动退出..." /nh') do (
  20.    taskkill /f /pid %%a >nul
  21. )
  22. exit
复制代码

作者: AnyName    时间: 2009-4-9 13:38

谢谢几位高人的指点!

俺研究了一上午才基本弄懂啊……

根据楼上的代码修改我原来的:
  1. @echo off
  2. set tt=10
  3. if not "%1"=="" goto %1
  4. del /f "%temp%\#" 2>nul
  5. start /b "" "%~f0" :count
  6. pause
  7. >"%temp%\#" type nul
  8. exit
  9. :count
  10. if %tt%==0 (
  11. title 自动退出...
  12. for /f "tokens=2" %%a in ('tasklist /fi "windowtitle eq 自动退出..." /nh') do (taskkill /f /pid %%a>nul)
  13. exit
  14. )
  15. if exist "%temp%\#" (
  16. del "%temp%\#"
  17. exit
  18. )
  19. cls&echo 按任意键退出
  20. echo %tt%秒后自动退出
  21. ping -n 2 127.1>nul
  22. set /a tt-=1
  23. goto :count
复制代码
用choice实现的:
  1. @echo off
  2. set TT=3
  3. for /l %%a in (%TT%,-1,1)do (
  4. cls&echo 按任意字母键退出
  5. echo %%a秒后自动退出
  6. choice/c abcdefghijklmnopqrstuvwxyz1 /t 1 /d 1 >nul||if not errorlevel 27 exit
  7. )
复制代码

[ 本帖最后由 AnyName 于 2009-4-9 13:43 编辑 ]
作者: wc726842270    时间: 2010-9-15 02:10

有个小问题。用任意键退出。那能否用CHOICE 和 GOTO PAUSE解决呢
作者: muink    时间: 2014-2-25 21:29

算是弄懂了
  1. @echo off
  2. rem 用于分别启动两个线程,读取程序启动时的第一个参数,如果为空,执行第一线程代码段。
  3. rem 第一个线程是start "" "此批处理文件"
  4. rem 第二个线程是start "" "此批处理文件" :aa
  5. rem “此批处理文件”为第零个参数,“:aa”为第一个参数
  6. if not "%1"=="" goto %1
  7. rem 删除第二线程用于判断退出的文件,排除误判的可能
  8. del "%temp%\#" 2>nul
  9. rem 开启第二个线程(运行第一线程的第一段代码,跳转至aa开始执行第二线程代码)
  10. start %~fs0 :aa
  11. rem 仅仅是显示“按任意键退出...”字符
  12. set/p=按任意键退出...<nul
  13. rem 隐藏了输出的按任意键继续
  14. pause>nul
  15. rem 在系统temp目录下生成“#”文件,第二线程检测到此文件将退出
  16. type nul>"%temp%\#"
  17. rem 第一线程退出
  18. exit
  19. rem 第二线程的代码段
  20. :aa
  21. rem 循环将10减1,减到1为止,每减一次,执行一次括号内代码
  22. for /l %%a in (10 -1 1) do (
  23. rem 标题显示多少秒后退出,%%a中放的是之前减法得到的数值
  24.    title 倒计时 %%a 秒后自动退出...
  25. rem 判断是否存在由第一线程生成的文件
  26.    if exist "%temp%\#" (
  27. rem 删除文件并退出线程
  28.       del "%temp%\#"
  29.       exit
  30.    )
  31. rem 延迟一秒
  32.    ping -n 2 127.1>nul
  33. )
  34. rem 杀死全部线程
  35. title 自动退出...
  36. for /f "tokens=2" %%a in ('tasklist /fi "windowtitle eq 自动退出..." /nh') do (
  37.    taskkill /f /pid %%a >nul
  38. )
  39. exit
复制代码





欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2