Board logo

标题: [其他] 批处理倒计时与按任意键中止 [打印本页]

作者: cjiabing    时间: 2011-4-20 22:23     标题: 批处理倒计时与按任意键中止

本帖最后由 cjiabing 于 2013-7-10 11:44 编辑

尝试新方法!~
  1. @echo off
  2. title 倒计时与中止
  3. start /b "" cmd /c "set /p=按任意键结束 . . . <nul&pause>nul&title #Pause&exit/b"
  4. for /l %%i in (9,-1,1) do (for /f %%a in ('tasklist /fi  "WINDOWTITLE eq #Pause" /nh') do if not "%%a"=="" goto OVER)>nul 2>nul&set /p=%%i<nul&ping /n 2 127.0.1>nul
  5. echo 倒计时结束!
  6. exit
  7. rem 正常结束不必使用暂停命令。
  8. :OVER
  9. echo 倒计时结束!
  10. pause
  11. exit
复制代码


倒计时等待输入与自动选择任务
  1. @echo off
  2. set #title=倒计时与选择
  3. Rem 设置程序标题,重要。
  4. set #time=5
  5. Rem 设置倒计时时间“秒”
  6. if "%~1"=="1" goto 默认任务
  7. Rem 设置默认任务
  8. :loop
  9. title %#title%
  10. start /b "" cmd /c "@echo off&(set /p=[倒计时:<nul&for /l %%i in (%#time%,-1,0) do (for /f %%a in ('tasklist /fi  "WINDOWTITLE eq #Pause" /nh') do exit/b)>nul 2>nul&set /p=%%i]<nul&ping /n 2 127.0.1>nul)&start "" %0 1&taskkill /fi  "WINDOWTITLE eq %#title%""
  11. :选择  【此处为你的选择代码】
  12. cls
  13. echo 开始下注,请在 5秒 内选择下注金额 . . .
  14. echo.
  15. echo 1.下注100万!
  16. echo 2.下注500万!
  17. echo 3.下注1000万!
  18. echo.
  19. set /p input=请选择:
  20. if "%input%"=="" goto loop
  21. title #Pause
  22. Rem 设置结束倒计时开关
  23. if %input%==1 echo  您已经下注 100 万!&pause
  24. if %input%==2 echo  您已经下注 500 万!&pause
  25. if %input%==3 echo 您已经下注 1000 万!&pause
  26. goto loop
  27. :默认任务
  28. echo 您已经下注 1000 万!
  29. pause&goto loop
复制代码



后面是旧版:

  1. @echo off
  2. ::by cjiabing&from http://www.bathome.net
  3. echo;
  4. echo     开始倒计时,10 秒后自动关闭进程,取消倒计时请按任意键!
  5. echo;
  6. call :DaoJiShi 10
  7. echo;
  8. echo;    演示结束,你中止了倒计时!
  9. echo;
  10. pause
  11. exit
  12. :DaoJiShi  引用方法:call :DaoJiShi 10
  13. set /p=    请按任意键继续. . .<nul&if exist "%temp%\$0.tmp" del "%temp%\$0.tmp"
  14. start /b  "" cmd /c "(for /l %%a in (%1,-1,0) do @if %%a lss 10 (for %%i in (0%%a) do @set /p= %%i <nul&title %%a&ping /n 2 127.0.1>nul&if exist "%temp%\$0.tmp" exit) else (@set /p= %%a <nul&title %%a&ping /n 2 127.0.1>nul&if exist "%temp%\$0.tmp" exit))&&(title KillDaoJiShi&for /f "skip=3 tokens=2" %%a in ('TASKLIST /FI "WINDOWTITLE  eq  KillDaoJiShi"   /FI "STATUS eq running"') do taskkill /f /t /pid %%a>nul 2>nul)"
  15. pause>nul&cd.>"%temp%\$0.tmp"&echo;
  16. goto :eof
复制代码


见有些人玩倒计时提示任务,俺也来一个,复杂了点。
以下设计了三种类型,可以用来执行不同的任务。
第一个可以在窗口内显示倒计时,其它两个在标题上显示。
将15该成你要的时间。
  1. @echo off
  2. ::by cjiabing
  3. ::from http://hi.baidu.com/cjiabing
  4. ::采用start /b打开双进程,子进程执行倒计时,父进程执行任意键,并以"%temp%\$0.tmp"作为控制点;
  5. ::当倒计时自然结束时,该控制点由子进程发出,父进程接收并执行相应命令,如:Taskkill。
  6. ::当倒计时被任意键中断时,该控制点是由父进程发出,子进程接收并停止倒计时,父进程继续执行相应命令;
  7. ::使用 for /l 和 ping控制时间,第一个时间限于100以内,否则需要修改后面的退格键和空格个数。但标题可以正确显示。
  8. echo;
  9. echo     导弹即将发射,开始15秒倒计时,取消请按任意键!
  10. call :DaoJiShi
  11. echo;
  12. echo;
  13. echo     你终止了倒计时。
  14. echo;    导弹没有发射出去,世界和平!
  15. echo;
  16. echo     ——第一种,下面是第二种
  17. pause
  18. cls
  19. call :DaoJiShi1
  20. echo;
  21. echo     ——第二种,下面是第三种
  22. echo;
  23. pause
  24. cls
  25. call :DaoJiShi2
  26. echo;
  27. echo     ——第三种,下面是执行任务
  28. exit
  29. echo;
  30. :newplan
  31. echo     终止倒计时之后,我来到了这里。  
  32. pause
  33. exit
  34. :DaoJiShi
  35. ::窗口显示倒计时,结束后自动退出。
  36. echo;
  37. set /p=    15 秒钟后自动退出,请按任意键继续. . .<nul
  38. if exist "%temp%\$0.tmp" del "%temp%\$0.tmp"
  39. start /b  "" cmd /c "(for /l %%a in (15,-1,0) do @if %%a lss 10 (for %%i in (0%%a) do @set /p= %%i <nul&title %%a&ping /n 2 127.0.1>nul&if exist "%temp%\$0.tmp" exit) else (@set /p= %%a <nul&title %%a&ping /n 2 127.0.1>nul&if exist "%temp%\$0.tmp" exit))&&(title KillDaoJiShi&for /f "skip=3 tokens=2" %%a in ('TASKLIST /FI "WINDOWTITLE  eq  KillDaoJiShi"   /FI "STATUS eq running"') do taskkill /f /t /pid %%a>nul 2>nul)"
  40. pause>nul
  41. cd.>"%temp%\$0.tmp"
  42. goto :eof
  43. :DaoJiShi1
  44. ::使用标题显示倒计时
  45. echo;
  46. set /p=    15 秒钟后自动退出,请按任意键继续. . .<nul
  47. if exist "%temp%\$0.tmp" del "%temp%\$0.tmp"
  48. start /b  "" cmd /c "(for /l %%a in (15,-1,0) do @title %%a&ping /n 2 127.0.1>nul&if exist "%temp%\$0.tmp" exit)&&(title KillDaoJiShi&for /f "skip=3 tokens=2" %%a in ('TASKLIST /FI "WINDOWTITLE  eq  KillDaoJiShi"   /FI "STATUS eq running"') do taskkill /f /t /pid %%a>nul 2>nul)"
  49. pause>nul
  50. cd.>"%temp%\$0.tmp"
  51. goto :eof
  52. :DaoJiShi2
  53. ::使用标题显示倒计时。倒计时结束后不退出,而是执行其它任务
  54. echo;
  55. set /p=    15 秒钟后执行任务,请按任意键继续. . .<nul
  56. if exist "%temp%\$0.tmp" del "%temp%\$0.tmp"
  57. if exist "%temp%\$1.tmp" del "%temp%\$1.tmp"
  58. start /b  "" cmd /c "(for /l %%a in (15,-1,0) do @title %%a&ping /n 2 127.0.1>nul&if exist "%temp%\$0.tmp" exit)&&(cd.>"%temp%\$1.tmp")"
  59. start /b  "" cmd /c "pause>nul&cd.>"%temp%\$0.tmp""
  60. goto lp
  61. goto :eof
  62. exit
  63. :lp
  64. ping /n 2 127.0.1>nul
  65. if exist "%temp%\$1.tmp" goto newplan
  66. if exist "%temp%\$0.tmp" goto :eof
  67. goto lp
复制代码

作者: plp626    时间: 2011-4-21 14:34

1# cjiabing


如果你用临时文件作为进程之间的通信,可以不用taskill来杀进程,你完全可以在读秒的前判断另个一个进程是否生产临时文件,或者判断临时文件的首行的字符变化情况;来决定退出与否;
作者: plp626    时间: 2011-4-21 14:35

taskill.exe这个三方工具在不保险,某些公用电脑把他删了。
作者: cjiabing    时间: 2011-4-21 14:56

2# plp626
呵呵,没想过要在临时文件里面写东西,这个主意倒不错,不过需要另外代码处理。
至于taskkill,无法考虑得那么周全,按照一般电脑处理就可以了。
当时在处理如何让它在倒计时结束后自然退出时遇到点困难,不能直接用taskkill,否则连主程序都杀掉。
所以,后来发展了第三种,不过用到两个临时文件了,或许如你说的,可以写入内容,进行更精确的控制。
比如,自然结束就 echo;0>$.tmp;中止结束就 echo;1>$.tmp。
进行其它操作就输入其它字符,然后再用其它命令接受和判断。
这个有空再深入研究一下。
作者: jackmux    时间: 2012-2-6 11:40

有点深奥。
作者: REVENTON    时间: 2012-2-27 22:57

啥意思
......................
作者: cjw00529017    时间: 2013-9-8 19:04

(for /f %%a in ('tasklist /fi  "WINDOWTITLE eq #Pause" /nh') 神马意思
作者: 804260247    时间: 2015-4-5 21:18

支持一个,感谢。。。。
作者: ligyste    时间: 2015-7-13 09:34

厉害,学习了啊
作者: re168    时间: 2016-7-2 17:47

感谢楼主的分享!支持...
作者: jm117    时间: 2016-8-21 22:02

有点意思,我需要不断学习才看得明白
作者: Oink6080    时间: 2023-1-23 19:47

楼主这个,如果时管理员模式就不行啦,我查了资料都没有一个较好的解决方式




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