返回列表 发帖

[其他] 批处理倒计时与按任意键中止

本帖最后由 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
exitCOPY


倒计时等待输入与自动选择任务
@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 loopCOPY



后面是旧版:

@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 :eofCOPY


见有些人玩倒计时提示任务,俺也来一个,复杂了点。
以下设计了三种类型,可以用来执行不同的任务。
第一个可以在窗口内显示倒计时,其它两个在标题上显示。
将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 lpCOPY
1

评分人数

寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

1# cjiabing


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

TOP

taskill.exe这个三方工具在不保险,某些公用电脑把他删了。

TOP

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

TOP

有点深奥。
简单

TOP

啥意思
......................

TOP

(for /f %%a in ('tasklist /fi  "WINDOWTITLE eq #Pause" /nh') 神马意思

TOP

支持一个,感谢。。。。

TOP

厉害,学习了啊

TOP

感谢楼主的分享!支持...

TOP

有点意思,我需要不断学习才看得明白

TOP

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

TOP

返回列表