找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 41349|回复: 7

[已解决]批处理如何实现在倒计时结束前按任意键退出?

[复制链接]
发表于 2009-4-8 18:42:12 | 显示全部楼层 |阅读模式
比如下面的代码,是显示一个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 编辑 ]

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢主动给标题标注[已解决]字样

查看全部评分

发表于 2009-4-8 20:01:13 | 显示全部楼层
choice?
还是多线程?
别告诉我可以点窗口上方的关闭按钮啊 = =!
就这个也行嘛...
发表于 2009-4-8 20:52:55 | 显示全部楼层
基本可以做到,但要用到choice.exe
http://bbs.bathome.net/viewthread.php?tid=2245&highlight=choice

[ 本帖最后由 batman 于 2009-4-8 20:54 编辑 ]
发表于 2009-4-9 00:22:28 | 显示全部楼层
利用双进程可以实现:
  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
复制代码

评分

参与人数 2技术 +2 收起 理由
acaigg + 1 代码巧妙
zm900612 + 1 构思绝妙

查看全部评分

 楼主| 发表于 2009-4-9 13:38:40 | 显示全部楼层
谢谢几位高人的指点!

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

根据楼上的代码修改我原来的:

  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 编辑 ]

评分

参与人数 1PB +10 收起 理由
more + 10 值得鼓励!!!

查看全部评分

发表于 2010-9-15 02:10:19 | 显示全部楼层
有个小问题。用任意键退出。那能否用CHOICE 和 GOTO PAUSE解决呢
发表于 2014-2-25 21:29:37 | 显示全部楼层
算是弄懂了

  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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-21 05:28 , Processed in 0.030857 second(s), 18 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表