标题: [已解决]批处理如何实现在倒计时结束前按任意键退出? [打印本页]
作者: AnyName 时间: 2009-4-8 18:42 标题: [已解决]批处理如何实现在倒计时结束前按任意键退出?
比如下面的代码,是显示一个10秒的倒计时,然后程序自动退出。
有没有什么办法,可以在倒计时结束前,按任意键就使程序退出呢?
- @echo off
- Set TT=10
- :count
- cls&echo 设置成功! %TT%秒后自动退出
- IF %TT%==0 exit
- set var=%time:~7,1%
- :loop
- set num=%time:~7,1%
- if %var%==%num% (goto loop) else (set var=%time:~7,1%)
- set /a TT-=1
- 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
利用双进程可以实现:- @echo off
- if not "%1"=="" goto %1
- del "%temp%\#" 2>nul
- start /b %~fs0 :aa
- :agn
- set/p=按任意键退出...<nul&pause>nul
- >"%temp%\#" type nul
- exit
- :aa
- for /l %%a in (10 -1 1) do (
- title 倒计时 %%a 秒后自动退出...
- if exist "%temp%\#" (
- del "%temp%\#"
- exit
- )
- ping -n 2 127.1>nul
- )
- title 自动退出...
- for /f "tokens=2" %%a in ('tasklist /fi "windowtitle eq 自动退出..." /nh') do (
- taskkill /f /pid %%a >nul
- )
- exit
复制代码
作者: AnyName 时间: 2009-4-9 13:38
谢谢几位高人的指点!
俺研究了一上午才基本弄懂啊……
根据楼上的代码修改我原来的:-
- @echo off
- set tt=10
- if not "%1"=="" goto %1
- del /f "%temp%\#" 2>nul
- start /b "" "%~f0" :count
- pause
- >"%temp%\#" type nul
- exit
- :count
- if %tt%==0 (
- title 自动退出...
- for /f "tokens=2" %%a in ('tasklist /fi "windowtitle eq 自动退出..." /nh') do (taskkill /f /pid %%a>nul)
- exit
- )
- if exist "%temp%\#" (
- del "%temp%\#"
- exit
- )
- cls&echo 按任意键退出
- echo %tt%秒后自动退出
- ping -n 2 127.1>nul
- set /a tt-=1
- goto :count
复制代码
用choice实现的:-
- @echo off
- set TT=3
- for /l %%a in (%TT%,-1,1)do (
- cls&echo 按任意字母键退出
- echo %%a秒后自动退出
- choice/c abcdefghijklmnopqrstuvwxyz1 /t 1 /d 1 >nul||if not errorlevel 27 exit
- )
复制代码
[ 本帖最后由 AnyName 于 2009-4-9 13:43 编辑 ]
作者: wc726842270 时间: 2010-9-15 02:10
有个小问题。用任意键退出。那能否用CHOICE 和 GOTO PAUSE解决呢
作者: muink 时间: 2014-2-25 21:29
算是弄懂了- @echo off
- rem 用于分别启动两个线程,读取程序启动时的第一个参数,如果为空,执行第一线程代码段。
- rem 第一个线程是start "" "此批处理文件"
- rem 第二个线程是start "" "此批处理文件" :aa
- rem “此批处理文件”为第零个参数,“:aa”为第一个参数
- if not "%1"=="" goto %1
- rem 删除第二线程用于判断退出的文件,排除误判的可能
- del "%temp%\#" 2>nul
- rem 开启第二个线程(运行第一线程的第一段代码,跳转至aa开始执行第二线程代码)
- start %~fs0 :aa
- rem 仅仅是显示“按任意键退出...”字符
- set/p=按任意键退出...<nul
- rem 隐藏了输出的按任意键继续
- pause>nul
- rem 在系统temp目录下生成“#”文件,第二线程检测到此文件将退出
- type nul>"%temp%\#"
- rem 第一线程退出
- exit
- rem 第二线程的代码段
- :aa
- rem 循环将10减1,减到1为止,每减一次,执行一次括号内代码
- for /l %%a in (10 -1 1) do (
- rem 标题显示多少秒后退出,%%a中放的是之前减法得到的数值
- title 倒计时 %%a 秒后自动退出...
- rem 判断是否存在由第一线程生成的文件
- if exist "%temp%\#" (
- rem 删除文件并退出线程
- del "%temp%\#"
- exit
- )
- rem 延迟一秒
- ping -n 2 127.1>nul
- )
- rem 杀死全部线程
- title 自动退出...
- for /f "tokens=2" %%a in ('tasklist /fi "windowtitle eq 自动退出..." /nh') do (
- taskkill /f /pid %%a >nul
- )
- exit
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |