标题: 【练习-029】批处理利用choice进行程序倒计时启动 [打印本页]
作者: batman 时间: 2008-10-22 10:40 标题: 【练习-029】批处理利用choice进行程序倒计时启动
出题目的:
了解并利用第三方工具choice.exe
加分原则:
1、完善代码加分10分
2、其中思路独特基分5分
3、代码简洁基分3分
4、不用其它命令进行延时基分2分
题目如下:
利用choice.exe在程序启动前进行10秒倒计时,中间可按任意字母退出,10秒后自动启动程序,至于要启动什么样的程序只需表示出来即可,你甚至于用一个echo命令表示就可以了。
choice.exe下载:http://bbs.bathome.net/thread-1726-1-1.html
[ 本帖最后由 Batcher 于 2009-5-1 21:10 编辑 ]
作者: rat 时间: 2008-10-22 14:52
- @choice/c abcdefghijklmnopqrstuvwxyz1 /t 10 /d 1 >nul||if errorlevel 27 cmd
复制代码
作者: batman 时间: 2008-10-22 14:58
rat兄就是不一样,一句命令够简洁,但兄似乎漏掉了倒计时。。。
作者: lixiaodaoaaa 时间: 2008-10-22 15:58 标题: 达到了部分要求
- @echo off
- color b0
- @mode con cols=26 lines=13
- choice /t 10 /d Y
- echo we love batman very much
- ::代码实现了10秒自动echo we love batman very much
- ::的功能,但是,其他按任意键退出的功能,没有实现
- ::希望楼下能写出,满意的作品,我太菜了。
- echo.&echo.&echo.&echo.
复制代码
达到了部分要求,就少加点分,鼓励一下哈
[ 本帖最后由 lixiaodaoaaa 于 2008-10-22 16:06 编辑 ]
作者: lixiaodaoaaa 时间: 2008-10-22 16:05
原帖由 rat 于 2008-10-22 14:52 发表
@choice/c abcdefghijklmnopqrstuvwxyz1 /t 10 /d 1 >nul||if errorlevel 27 cmd
按任意键,退出,你的功能实现了,但是按 space键,不退出,哈哈
那就不算按任意键了。。。。就有问题了 ^_^ ,按数字键 1——9 也不行,也不退出,电脑反而叫一声,哈哈
所以代码需要继续完善。。。莫非代码非得变成
- @choice /c abcdefghijklmnopqrstuvwxyz1234567890 /t 10 /d 2>nul ||if errorlever 33 cmd
复制代码
[ 本帖最后由 lixiaodaoaaa 于 2008-10-22 16:12 编辑 ]
作者: batman 时间: 2008-10-22 16:13
原帖由 lixiaodaoaaa 于 2008-10-22 16:05 发表
按任意键,退出,你的功能实现了,但是按 space键,不退出,哈哈
那就不算按任意键了。。。。就有问题了 ^_^
所以代码需要继续完善。。。
任意键是做不到的,所以本题也只要求任意字母退出,同时本人来抛下砖吧:
- @echo off
- set "n=10"
- :begin
- cls&echo 请输入任意字母退出,否则10秒后程序将启动,计时:%n%秒
- choice /c 1abcdefghijklmnopqrstuvwxyz /d 1 /t 1 /n
- if %errorlevel% neq 1 goto :eof
- set /a n-=1
- if %n% neq 0 (goto begin) else (goto next)
- :next
- cls&echo 程序已启动&pause>nul
复制代码
作者: more 时间: 2008-10-22 16:17
- @echo off
- set "times=10"
- echo 按任意键退出运行程序,默认 10 秒启动程序
- :bgn
- set/p=还剩下 %times% 秒...<nul
- if "%times%"=="0" goto :run
- set /a "times-=1"
- choice /T 1 /C abcdefghijklmnopqrstuvwxyz /d a >nul
- if "%errorlevel%"=="1" (goto :bgn) else (goto :end)
- :run
- echo.&echo 程序已经启动...
- pause>nul&goto :eof
- :end
- echo.&echo 已经退出程序...
- pause>nul
复制代码
谢谢版主提醒,现更改如下:
- @echo off
- set "times=10"
- echo 按任意字母键退出运行程序,默认 10 秒启动程序
- :bgn
- set/p=还剩下 %times% 秒...<nul
- if "%times%"=="0" goto :run
- set /a "times-=1"
- choice /T 1 /C 0abcdefghijklmnopqrstuvwxyz /d 0 >nul
- if "%errorlevel%"=="1" (goto :bgn) else (goto :end)
- :run
- echo.&echo 程序已经启动...
- pause>nul&goto :eof
- :end
- echo.&echo 已经退出程序...
- pause>nul
复制代码
[ 本帖最后由 more 于 2008-10-22 17:03 编辑 ]
作者: batman 时间: 2008-10-22 16:50
楼上的代码会忽略字母"a"。。。
作者: rat 时间: 2008-10-22 16:54
- @for /l %%a in (10,-1,0)do @cls&echo %%a&choice/c abcdefghijklmnopqrstuvwxyz1 /t 1 /d 1 >nul||if errorlevel 27 (if %%a==0 calc)else exit/b
复制代码
[ 本帖最后由 rat 于 2008-10-22 17:10 编辑 ]
作者: batman 时间: 2008-10-22 17:03
修改下本人6楼的代码:- @echo off&setlocal enabledelayedexpansion
- for /l %%i in (10,-1,0) do (
- cls&echo 请输入任意字母退出,否则10秒后程序将启动,计时:%%i秒
- choice /c 1abcdefghijklmnopqrstuvwxyz /d 1 /t 1 /n
- if !errorlevel! neq 1 goto :eof
- )
- cls&echo 程序已启动&pause>nul
复制代码
作者: pusofalse 时间: 2008-10-22 18:13
- @echo off
- set n=4
- :LOOP
- set /p =%n%<nul & set /a n-=1
- Choice /c abcdefghijklmnopqrstuvwxyz1 /d 1 /t 1 /n>nul
- if not errorlevel 27 exit /b
- if %n% neq 0 goto :LOOP
- echo. &echo 程序已经启动
- pause
复制代码
[ 本帖最后由 pusofalse 于 2008-10-22 19:57 编辑 ]
作者: batman 时间: 2008-10-22 19:46
pusofalse版主最后一句是不是丢掉了pause,你这样的效果是倒计时后也是退出。。。
作者: 随风 时间: 2008-10-22 19:52
感觉此题已经脱离了 choice 的实际用途,在这里只是起到延时作用。
类似与 for /l %%a in (1 1100) do ver>nul
作者: batman 时间: 2008-10-22 19:57
原帖由 随风 于 2008-10-22 19:52 发表
感觉此题已经脱离了 choice 的实际用途,在这里只是起到延时作用。
类似与 for /l %%a in (1 1100) do ver>nul
随风兄此言差已,不用choice能实现输入字符就退出吗?我想纯批不回车是做不到的。。。再说,本题的目的也是
在于让更多的人了解choice这个三方工具啊。
作者: pusofalse 时间: 2008-10-22 19:57 标题: 回复 12楼 的帖子
因为我是在CMD中运行的此批处理,已经修改好了,多谢提醒!。
作者: jellyhk 时间: 2008-10-22 20:23
哈哈 !我搞 了3个小时才搞出来!头都疼了!
-------------------------------------------------------------------------------
斑竹啊!加分哦!!!!
-----------------------------------------------------------------------
@echo off
choice /c qwertyuioplkjhgfdsazxcvbnm1 /t 10 /d 1 >1.txt
for /f "tokens=2 delims=?" %%i in (1.txt) do echo %%i>1.txt
set /p input=<1.txt
if "%input%"=="1" echo I love bathome.net&del 1.txt&pause>nul (else exit)
del 1.txt
已经测试!可行!!如果要显示10 9 8 的倒记时的话用上面的有人用了!
-------------------------------------------------------------------------
哈哈!终于搞定了!!5555
作者: jellyhk 时间: 2008-10-22 20:30
原帖由 rat 于 2008-10-22 14:52 发表
@choice/c abcdefghijklmnopqrstuvwxyz1 /t 10 /d 1 >nul||if errorlevel 27 cmd
斑竹就是斑竹 !
功力非俺们菜鸟能比啊!
-------------------------------------------------
不过能问几个问题么?
1:errorlevel 27
????????
怎么有27?那不是说有25 ?26?100?89?是数字都有?
2:27代表什么?有其他的返回值也说些代表什么!
3:||好像是前面错误才会运行后面!怎么前面的代码没错误啊!运行也不会出现错误啊!不懂!!我对这个符号感冒!!!
作者: pusofalse 时间: 2008-10-22 20:55
errorlevel 27
因为abcdefg......xyz1,正好是27个字符啊。
从最后一位开始判断。。。如果只有20个字符,那就是if errorlevel 20....了。。。
你可以这样理解,27就是1,26就是z,25就是y。。。1就是a(最开头的那个)。
只不过用choice时,要从后向前判断。。。
并不是所有的不成功的命令都会显示出错信息。
比如findstr "PUSOFALSE" 1.txt,虽然没有找到PUSOFALSE(运行失败),但是却没有任何返回结果。
作者: rat 时间: 2008-10-22 21:47 标题: 回复 17楼 的帖子
请参考if /?和choice /?
if errorlevel 27 cmd相当于if %errorlevel% gtr 27,即大于或等于27(27表示字符1,前面的字符依次递减——这个值由choice命令返回,一言难尽,请参考choice /?).
关于||:(如A || B)
一般可以理解为如果A执行成功则不执行B;如果A执行失败则执行B。
而事实上,B能不能执行其实依赖于errorlevel的值——如果执行A后errorlevel的值为0(一般表示执行成功),则不会执行B;否则会执行B。而choice命令执行后使得errorlevel的值>=1,所以一定会执行||后的命令。
(说完累倒……)
作者: batman 时间: 2008-10-22 23:23 标题: 知其然还应知其所以然
看来大家对choice都还是有所兴趣,下面我就来简单讲讲choice.exe的运行机制吧:
其实choice.exe的参数是比较简单的,就先解释下程序的参数吧:
/c 指定要选择的项,这个项是以一个字符为一个项,如输入choice /c 12345
程序就会认定有5个选项,而省略/c参数,程序就会默认yn为选项;
/m "..."选项提示信息,如此例choice /c 123 /m "1继续,2返回,3退出";
/n 隐藏选项信息,仅保留提示信息;
/t 指定选择默认项之前等待的时间,这个时间是以秒为单位的,数值范围是
0-999,数值为0即为不等待;
/d 在有/t参数的前提下指定选项中的默认选项,如choice /c abc /d c /t
10就是在10秒后指定默认选项c,其实我们可以得用choice这个特性来做延时处理;
/cs choice默认选项是不区分大小写的,只有使用/cs参数才会区别大小写,
如choice /cs /c Aa这样才会认定Aa是两个选项。
接下来以下面这段代码来做为示例,来讲讲choice.exe的判断机制:- @echo off
- choice /c abc
- goto %errorlevel%
- :1
- echo bathome&goto end
- :2
- echo batman&goto end
- :3
- echo wrong
- :end
- pause>nul
复制代码
当输入a时会显示bathome,当输入b时会显示batman,当输入c时会显示wrong
,那么程序是怎么做到跳转的呢?原来当choice接收用户输入的信息时就会反馈
给系统一个值errorlevel,而这个值是从1开始并随选项向后递增的,像上面这段
代码中接收a字符的返回值为1、b为2、c为3,除些以外返回值均为255,也就是无
效输入,因此可见choice的选项最多可以有254个(因为choice选项不支持中文字
符,因此是达不到最高选项数的)。
好了,本人也就简单讲到这里,至于怎么灵活运用choice就看大家平时的实
践和思考了。
[ 本帖最后由 batman 于 2008-10-22 23:32 编辑 ]
作者: qq641255849 时间: 2008-10-24 20:22
rat兄真够牛,比我的精简好多...- @echo off
- set t=10
- set n=happy birthday,bathome
- :main
- choice /c 1abcdefghijklmnopqrstuvwxyz /d 1 /t 1 /n>nul
- if %errorlevel% gtr 1 (cls&echo %n%&pause&exit /b)
- if "%t%" equ "0" (cls&echo %n%&pause) else (set/a t-=1&call echo %t%&goto :main
- )
复制代码
看来我真的是想太多了...
[ 本帖最后由 qq641255849 于 2008-10-24 20:23 编辑 ]
作者: batman 时间: 2008-10-24 21:16
楼上是不是再检查下自己的代码?
作者: qq641255849 时间: 2008-10-24 22:57
不对吗...
大大指正下?
作者: batman 时间: 2008-10-24 23:02
问题一:倒计时不合要求,在:main标签下加个cls能解决
问题二:无论怎么样后面的happy birthday,bathome都会执行,没有退出程序
作者: qq641255849 时间: 2008-10-24 23:08
哦,改改看看.谢谢指正!
作者: 嘟嘟猪 时间: 2008-10-25 16:56 标题: 大家忽略了errorlevel值
choice会更改errorlevel值,如果程序中要用到errorlevel值,应该这样写:
- @echo off
- echo 现在errorlevel值为%errorlevel%
- set etmp=%errorlevel%
- choice /c qwertyuiopasdfghjklzxcvbnm1 /n /t 10 /d 1 /m 10s后将运行程序
- if %errorlevel%==27 goto run
- exit
- :run
- cls
- rem 运行程序
- set errorlevel=%etmp%
- echo 程序运行完毕,errorlevel值依然为%errorlevel%
- pause
复制代码
作者: keen 时间: 2009-5-24 17:41
- @echo off
- choice /c 1abcdefghijklmnopqrstuvwxyz /n /t 10 /d 1 /m "程序10妙后启动,或者按任意字母键退出!"
- if %errorlevel% neq 1 exit/b
- start "cmd" cmd.exe
复制代码
作者: hzcxdgioa 时间: 2013-11-30 06:05
谢谢lz分享。。。。。。。。。
作者: 狱渊 时间: 2013-12-24 14:37
题目如下:
利用choice.exe在程序启动前进行10秒倒计时,中间可按任意字母退出,10秒后自动启动程序,至于要启动什么样的程序只需表示出来即可,你甚至于用一个echo命令表示就可以了。- @echo off
- choice /t:10 /c abc /d a
- if %errorlevel%==1 start QQ.exe
- if %errorlevel%==2 exit
- ......
复制代码
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |