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 ]