中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-30 11:14
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 在批处理中,如何显示倒计时? 查看 6,239 回复 33
楼 主 在批处理中,如何显示倒计时? 发表于 2006-04-08 21:29 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
20年会员
UID 50690
状态 离线
当用Choice设定延时命令时间后,如何在批处理中实现这个时间的倒计时显示?

请教了:)
2 发表于 2006-04-08 22:33 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
20年会员
UID 50690
状态 离线
顺计时也可:)
3 发表于 2006-04-09 00:00 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
20年会员
UID 50690
状态 离线
在网上搜索到的一个批处理如下:

以下面的格式运行LOOP.BAT逐一显示从1 到 9(注意参数之间要空格):
C:>LOOP 1 2 3 4 5 6 7 8 9

LOOP.BAT的内容:
代码:
@ECHO OFF
:LOOP
IF '%1'=='' GOTO END
SET COUNT=%1
CLS
ECHO %COUNT%
PAUSE
SHIFT
GOTO LOOP
:END

好像不够完整,执行不了!
而且从1 到 9逐一显示,也不妥。那样岂不是要显示10行!
4 发表于 2006-04-09 12:43 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
20年会员
UID 50690
状态 离线
最好有像Config.sys启动菜单所显示的倒计时。

不知哪位高手能解?
5 发表于 2006-04-09 13:14 ·  中国 重庆 联通
高级用户
★★
积分 772
发帖 273
注册 2004-10-23 00:00
21年会员
UID 32861
性别 男
状态 离线
w.bat可以
http://www.msfans.net/bbs/
6 发表于 2006-04-09 13:27 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
20年会员
UID 50690
状态 离线
最好是不用第三方工具。

用批处理来调用DOS本身的倒计时功能!
7 发表于 2006-04-09 19:12 ·  中国 山西 运城 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re martin325:

不用第三方工具,目前有两个方案:

1、使用debug现场修改choice,曾经做过这方面的尝试,后来考虑对choice的修改过大而失去了debug的意义,同时过多的插入代码也可能会对程序的健壮性带来影响,最后放弃了;

2、利用3楼提到的choice循环来完成。代码如下:

不过,考虑到这两种方案复杂度都比较高,还是推荐使用第三方工具。


:: TimeOut.bat - Test of timeout
:: Will Sort - 18:52 2006-4-9 - MSDOS7.10/COMMAND@Win98
@echo off
if "%1"=="" %0 : 9 8 7 6 5 4 3 2 1
if "%1"=="" goto end

:TimeOutLoop
cls
echo Please choose 1~9: %2
choice /c123456789_ /t:_,1 > nul
if not errorlevel 10 goto Chosen
shift
if not "%2"=="" goto TimeOutLoop

:Chosen
for %%e in (1 2 3 4 5 6 7 8 9) do if errorlevel %%e set _e=%%e
if errorlevel 10 set _e=
echo You choice: %_e%
set _e=

:end


[ Last edited by willsort on 2006-4-10 at 12:28 ]
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
8 发表于 2006-04-09 19:59 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
20年会员
UID 50690
状态 离线
不知显示30秒倒计时,可否把
if "%1"=="" %0 : 9 8 7 6 5 4 3 2 1

改为
if "%1"=="" %0 : 29 28 27 26 …………
9 发表于 2006-04-09 20:26 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
20年会员
UID 50690
状态 离线
刚刚测试了,发现没有达到预期效果,屏幕提示:

Invalid time
Enter new time
10 发表于 2006-04-10 00:00 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
20年会员
UID 50690
状态 离线
为什么config.sys能用MSDOS自身的计时器,而批处理不能调用呢?

请高手研究一下!
11 发表于 2006-04-10 12:28 ·  中国 山西 临汾 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re martin325:

Originally posted by martin325 at 2006-4-9 20:26:
刚刚测试了,发现没有达到预期效果,屏幕提示:

Invalid time
Enter new time


根据提示来看,是错误使用了time命令,而我的代码未使用到time,那么可能的原因是,你将代码命名为time.bat(本名为TimeOut.bat)或者在其他代码中使用time时出错。

为什么config.sys能用MSDOS自身的计时器,而批处理不能调用呢?

config.sys的倒计时由io.sys提供支持,而io.sys则是用汇编实现,算法应该是反复读取系统时钟。DOS本身应该并未提供可供调用的倒计时显示中断或函数。因此,批处理仍然需要借用其它命令或程序中的类似功能来替代性实现。
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
12 发表于 2006-04-10 12:53 ·  中国 广东 肇庆 盈联宽带
中级用户
★★
积分 384
发帖 189
注册 2005-10-19 13:12
20年会员
UID 43709
性别 男
状态 离线
我之前也曾在论坛上找过相关的资料,但没有找到现成的,所以就自己东拼西凑的"凑"了个出来...

在XP CMD(ver:5.1.2600)下测试通过...


@echo off
set /a i = 10
:Timeout
if %i% == 0 goto Next
setlocal
set /a i = %i% - 1
cls
echo 当前选择时间: %i%
call:Delay 1000此1000为延迟时间,以毫秒计算,,即1秒.作为引用下面延迟脚本的输入参数.
goto Timeout
goto End

:Next
cls & echo.
echo 恭喜!倒计时测试成功!
echo.
pause & exit

:End
echo 很抱歉!倒计时测试没有成功!
exit

::============================================================
:Delay
@echo off & setlocal enableextensions enabledelayedexpansion
echo WScript.Sleep %1 > %temp%.\tmp$$$.vbs
echo %time%>nul
cscript //nologo %temp%.\tmp$$$.vbs
echo %time%>nul
for %%f in (%temp%.\tmp$$$.vbs) do if exist %%f del %%f
endlocal & goto :EOF
13 [求助]如何将键盘的输入字符直接送入某变量作为选择项 发表于 2006-04-10 13:11 ·  中国 山西 临汾 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re voiL:

你的倒计时代码没有实现选择后中断倒计时的功能,用户只能选择等待,直到倒计时结束。而如果使用set/p或实现等待选择,则倒计时将无法继续,这应该是cmd脚本的局限性,只有考虑使用32位版本的choice.exe了。

另外,感觉你的vbs脚本只需要生成一次就足够了,在调用前生成,最后一次调用完成后删除,应该可以提高不少效率。否则,倒计时的精确性可能会受到影响。这应该算作模块化编程的弊病了。另外,:End标签感觉将始终无法抵达,因为在goto end总是先goto Timeout。


@echo off & setlocal enableextensions
echo WScript.Sleep 1000 > %temp%.\tmp$$$.vbs
set /a i = 10
:Timeout
if %i% == 0 goto Next
setlocal
set /a i = %i% - 1
cls
echo 当前选择时间: %i%
cscript //nologo %temp%.\tmp$$$.vbs
goto Timeout
goto End

:Next
cls & echo.
echo 恭喜!倒计时测试成功!
echo.
for %%f in (%temp%.\tmp$$$.vbs*) do del %%f
pause & exit
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
14 发表于 2006-04-10 20:38 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
20年会员
UID 50690
状态 离线
这个循环批处理中有“CLS”,目的使“echo 当前选择时间: %i%”始终在屏幕同一地方显示,但就是这个清屏命令,把本人认为应该给使用者的一些屏幕提示也一起清除了,呵呵,这个问题该如何解决?
15 发表于 2006-04-10 20:41 ·  中国 浙江 杭州 电信
银牌会员
★★★
积分 1,582
发帖 603
注册 2006-02-20 20:26
20年会员
UID 50690
状态 离线
现在需要解决两个问题:

一是保留已经在屏幕上显示的必要信息与提示

二是让倒计时显示始终在屏幕同一处显示
论坛跳转: