标题: [其他] 批处理倒计时与按任意键中止 [打印本页]
作者: cjiabing 时间: 2011-4-20 22:23 标题: 批处理倒计时与按任意键中止
本帖最后由 cjiabing 于 2013-7-10 11:44 编辑
尝试新方法!~
- @echo off
- title 倒计时与中止
- start /b "" cmd /c "set /p=按任意键结束 . . . <nul&pause>nul&title #Pause&exit/b"
- 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
- echo 倒计时结束!
- exit
- rem 正常结束不必使用暂停命令。
- :OVER
- echo 倒计时结束!
- pause
- exit
复制代码
倒计时等待输入与自动选择任务
- @echo off
- set #title=倒计时与选择
- Rem 设置程序标题,重要。
- set #time=5
- Rem 设置倒计时时间“秒”
- if "%~1"=="1" goto 默认任务
- Rem 设置默认任务
- :loop
- title %#title%
- 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%""
- :选择 【此处为你的选择代码】
- cls
- echo 开始下注,请在 5秒 内选择下注金额 . . .
- echo.
- echo 1.下注100万!
- echo 2.下注500万!
- echo 3.下注1000万!
- echo.
- set /p input=请选择:
- if "%input%"=="" goto loop
- title #Pause
- Rem 设置结束倒计时开关
- if %input%==1 echo 您已经下注 100 万!&pause
- if %input%==2 echo 您已经下注 500 万!&pause
- if %input%==3 echo 您已经下注 1000 万!&pause
- goto loop
- :默认任务
- echo 您已经下注 1000 万!
- pause&goto loop
复制代码
后面是旧版:
- @echo off
- ::by cjiabing&from http://www.bathome.net
- echo;
- echo 开始倒计时,10 秒后自动关闭进程,取消倒计时请按任意键!
- echo;
- call :DaoJiShi 10
- echo;
- echo; 演示结束,你中止了倒计时!
- echo;
- pause
- exit
-
-
-
- :DaoJiShi 引用方法:call :DaoJiShi 10
- set /p= 请按任意键继续. . .<nul&if exist "%temp%\$0.tmp" del "%temp%\$0.tmp"
- 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)"
- pause>nul&cd.>"%temp%\$0.tmp"&echo;
- goto :eof
复制代码
见有些人玩倒计时提示任务,俺也来一个,复杂了点。
以下设计了三种类型,可以用来执行不同的任务。
第一个可以在窗口内显示倒计时,其它两个在标题上显示。
将15该成你要的时间。- @echo off
- ::by cjiabing
- ::from http://hi.baidu.com/cjiabing
- ::采用start /b打开双进程,子进程执行倒计时,父进程执行任意键,并以"%temp%\$0.tmp"作为控制点;
- ::当倒计时自然结束时,该控制点由子进程发出,父进程接收并执行相应命令,如:Taskkill。
- ::当倒计时被任意键中断时,该控制点是由父进程发出,子进程接收并停止倒计时,父进程继续执行相应命令;
- ::使用 for /l 和 ping控制时间,第一个时间限于100以内,否则需要修改后面的退格键和空格个数。但标题可以正确显示。
- echo;
- echo 导弹即将发射,开始15秒倒计时,取消请按任意键!
- call :DaoJiShi
- echo;
- echo;
- echo 你终止了倒计时。
- echo; 导弹没有发射出去,世界和平!
- echo;
- echo ——第一种,下面是第二种
- pause
- cls
- call :DaoJiShi1
- echo;
- echo ——第二种,下面是第三种
- echo;
- pause
- cls
- call :DaoJiShi2
- echo;
- echo ——第三种,下面是执行任务
- exit
- echo;
- :newplan
- echo 终止倒计时之后,我来到了这里。
- pause
- exit
-
- :DaoJiShi
- ::窗口显示倒计时,结束后自动退出。
- echo;
- set /p= 15 秒钟后自动退出,请按任意键继续. . .<nul
- if exist "%temp%\$0.tmp" del "%temp%\$0.tmp"
- 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)"
- pause>nul
- cd.>"%temp%\$0.tmp"
- goto :eof
- :DaoJiShi1
- ::使用标题显示倒计时
- echo;
- set /p= 15 秒钟后自动退出,请按任意键继续. . .<nul
- if exist "%temp%\$0.tmp" del "%temp%\$0.tmp"
- 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)"
- pause>nul
- cd.>"%temp%\$0.tmp"
- goto :eof
-
- :DaoJiShi2
- ::使用标题显示倒计时。倒计时结束后不退出,而是执行其它任务
- echo;
- set /p= 15 秒钟后执行任务,请按任意键继续. . .<nul
- if exist "%temp%\$0.tmp" del "%temp%\$0.tmp"
- if exist "%temp%\$1.tmp" del "%temp%\$1.tmp"
- 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")"
- start /b "" cmd /c "pause>nul&cd.>"%temp%\$0.tmp""
- goto lp
- goto :eof
- exit
- :lp
- ping /n 2 127.0.1>nul
- if exist "%temp%\$1.tmp" goto newplan
- if exist "%temp%\$0.tmp" goto :eof
- 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 |