中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-06-16 09:23
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [已结]如何用Choice实现10秒内未输入指定字符即调用Autoexec 查看 1,655 回复 13
楼 主 [已结]如何用Choice实现10秒内未输入指定字符即调用Autoexec 发表于 2006-02-27 11:43 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
UID 50690
状态 离线
如题。

请各位高手帮忙!

[ Last edited by willsort on 2006-4-10 at 12:35 ]
2 发表于 2006-02-27 11:48 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
UID 50690
状态 离线
比如:
在autoexec.bat中当执行到
choice /c:a/n
时,一定得输入字符a,才会继续往下执行,否则10秒后就自动再次运行autoexec.bat本身。
3 发表于 2006-02-27 12:00 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
UID 50690
状态 离线
或者系统自动重启
4 发表于 2006-02-27 17:35 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
UID 50690
状态 离线
自己顶一下了
5 发表于 2006-02-27 21:13 ·  中国 福建 泉州 电信
初级用户
积分 86
发帖 32
注册 2006-01-27 15:56
UID 49579
状态 离线
Originally posted by martin325 at 2006-2-27 11:48:
比如:
在autoexec.bat中当执行到
choice /c:a/n
时,一定得输入字符a,才会继续往下执行,否则10秒后就自动再次运行autoexec.bat本身。


你是想要达到上面这个目的吗?如果是这样,只需要多设立一个选项,用开关/t设置为默认及等待时间,不就行了吗

[ Last edited by lks205 on 2006-2-27 at 21:30 ]
6 发表于 2006-02-28 04:22 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
UID 50690
状态 离线
想到了,也这样做了,很好。

而且又调用了一个含choice命令的批处理!
7 发表于 2006-02-28 09:30 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
UID 50690
状态 离线
Originally posted by martin325 at 2006-2-27 11:48:
比如:
在autoexec.bat中当执行到
choice /c:a/n
时,一定得输入字符a,才会继续往下执行,否则10秒后就自动再次运行autoexec.bat本身。

有一个问题,就是”非a“字符如何在Choice中表达?
8 发表于 2006-02-28 13:40 ·  中国 福建 泉州 电信
初级用户
积分 86
发帖 32
注册 2006-01-27 15:56
UID 49579
状态 离线
在开关/C:后面原意设几个就输入几个吧,比如 /c:12345也行
9 发表于 2006-02-28 15:28 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
UID 50690
状态 离线
这样也行,屏蔽了这些号码,但是没有屏蔽掉所有的”非a“字符。
10 发表于 2006-02-28 16:12 ·  中国 山西 临汾 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
UID 19
性别 男
状态 离线
Re martin325:


源于 choice.com 本身的特性,在实现指定时间内等待某个缺省按键的功能时,会出现一个小问题。

比如在代码中,如果直接按下 a 则以1为错误码结束choice,并继续运行;如果不按任何键等待10秒则以2为错误码结束choice,然后在if中再次进入autoexec.bat,看来似乎可以满足你的需要。

但不幸的是,如果在等待过程中按下了非a和n的键,则choice会终止原有的倒计时,将始终等待用户按下a或n键。也就是说,如果用户按下了未设定的无效按键字符,则缺省等待的倒计时将自动终止。这与 MSDOS 启动配置菜单中的倒计时特性如出一辙。

对这个特性,没有什么太好的解决办法,我的办法是修改 choice.com 。脚本是我以前所写的一个choice扩展脚本,它只能修改Win98下的choice.com,使用 debug choice.com < choicex.asd > nul 可以将它所在目录下的choice.com 修改并保存为新的 ChoiceX.com,这个choicex.com的功能扩展在中已经提到。

因为修改需要具备一些简单的dos和debug的知识,如果你不太熟悉,可以将脚本choicex.asd、批处理ModChc.bat以及Win98下的choice.com同时保存到一个目录下,然后运行ModChc.bat即可生成ChoiceX.com。

如果你只需要不终止倒计时的扩展,而不需要对Esc/回车/空格的额外扩展,那么你可以删去中047D和0A80两段。

choice test

choice /c:an /t:n,10 /n
if errorlevel 2 autoexec.bat
:: continue


ChoiceX.asd - Choice 扩展 DEBUG 汇编脚本

:: ChoiceX.asd - Choice 扩展 DEBUG 汇编脚本
:: Will Sort - 14:48 2005-5-15 - Debug
:: Modifition:
:: 1.Not terminates timeout when press invalid choice key
:: 2.press ESC to terminate timeout
:: 3.press CR or SPACE to choose default choice key
a 047D
JNZ 0482 ; Call 0A80 when press control key
CALL 0A80 ; get second byte of scancode of control key
CALL 0A85 ; process event of press ESC, CR, SPACE

a 04A2
JMP 0451 ; Not terminate timeout when press invalid choice key

a 0A80
MOV AH,08 ; get char again
INT 21
RET
CMP AL,1B ; if press ESC
JZ 0A94 ; YES, terminate timeout
CMP AL,0D ; if press CR
JZ 0A91 ; Yes, goto set default choice
CMP AL,20 ; if press SPACE
JNZ 0A99 ; No, goto return
MOV AL, ; set default choice
MOV BYTE PTR ,00 ; set timeout is zero
RET

n ChoiceX.com
w
q
:: Please reserved this line.


ModChc.bat - 扩展 choice.com 的缺省按键功能

:: ModChc.bat - 扩展 choice.com 的缺省按键功能
:: Will Sort - 2005-5-15 - CMD@WinXP
@echo off
if "%1"=="Error:" goto Error

:SysInit 设置 NT 命令行代码页,修正中文显示
if not "%OS%"=="Windows_NT" goto Locate
chcp 437>nul
graftabl 936>nul

:Locate
if exist ChoiceX.com %0 Error: Found ChoiceX.COM / 错误:已存在ChoiceX.COM

echo Locating script . . . 定位修改脚本 . . .
echo.
if not exist ChoiceX.asd %0 Error: Not found script / 错误:未找到修改脚本

echo Locating CHOICE.COM . . . 定位 CHOICE.COM . . .
echo.
if exist %windir%\command\choice.com set ChcLoc=%windir%\COMMAND
for %%p in (%path%) do if exist %%p.\choice.com set ChcLoc=%%p.
if exist %1.\choice.com set ChcLoc=%1.
if "%ChcLoc%"=="" %0 Error: Not found CHOICE.COM / 错误:未找到CHOICE.COM

:CheckIn
echo Checking CHOICE.COM . . . 验证 CHOICE.COM . . .
echo.
dir %ChcLoc%\choice.com | find "22:22"> nul
if errorlevel 1 %0 Error: Invalid CHOICE.COM / 错误:无效的CHOICE.COM

echo Located to %ChcLoc%\CHOICE.COM, Modify?
echo 定位到 %ChcLoc%\CHOICE.COM, 是否修改?
echo.
echo Cancel: press Ctrl+C key 取消: 请按Ctrl+C键
echo Continue: press other key 继续: 请按其它键
echo.
pause > nul

:Modify
Echo Modifying CHOICE.COM . . . 修改 CHOICE.COM . . .
echo.
copy %ChcLoc%\choice.com ChoiceX.com > nul
debug ChoiceX.com < ChoiceX.asd > nul

:CheckOut
Echo Checking new ChoiceX.COM . . . 验证新的 ChoiceX.COM . . .
echo.
if not exist ChoiceX.com %0 Error: Modification failed / 错误:修改失败
echo Modification passed ! 修改成功 !
goto End

:Error
echo %1 %2 %3 %4 %5 %6 %7 %8 %9
echo.

:Clear
for %%e in (ChcLoc ChsScr) do set %%e=

:End
echo Press any key to exit 按任意键结束
pause>nul


[ Last edited by willsort on 2006-2-28 at 16:27 ]
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
11 发表于 2006-02-28 17:11 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
UID 50690
状态 离线
看来什么问题也难不到斑竹的:)

佩服中……
12 发表于 2006-02-28 21:04 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
UID 50690
状态 离线
向热心的willsort版主致敬!

本人刚刚测试,一切OK!

谢谢
13 发表于 2006-03-07 17:15 ·  中国 广东 东莞 电信
初级用户
★★
积分 201
发帖 92
注册 2005-12-28 17:44
UID 48072
状态 离线
能否直接提供修改好的CHOICEX下载呀
14 提供修改好的CHOICE.COM下载 发表于 2006-04-08 21:02 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
UID 50690
状态 离线
按willsort斑竹的修改方案修改的CHOICE.COM,现提供直接下载。
附件
CHOICE.rar (2.85 KiB, 下载附件所需积分 1 点, 下载次数: 41)
论坛跳转: