中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-02 19:58
48,038 主题排行 / 350,123 发帖 / 今日 1 篇 / 48,251 会员排行
DOS批处理 & 脚本技术(批处理室) » 在批处理中,如何显示倒计时?
可打印版本  6,414 / 33
第1楼 martin325 发表于 2006-04-08 21:29
银牌会员 发帖 603 积分 1,582
在批处理中,如何显示倒计时?
当用Choice设定延时命令时间后,如何在批处理中实现这个时间的倒计时显示?

请教了:)
第2楼 martin325 发表于 2006-04-08 22:33
银牌会员 发帖 603 积分 1,582
顺计时也可:)
第3楼 martin325 发表于 2006-04-09 00:00
银牌会员 发帖 603 积分 1,582
在网上搜索到的一个批处理如下:

以下面的格式运行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楼 martin325 发表于 2006-04-09 12:43
银牌会员 发帖 603 积分 1,582
最好有像Config.sys启动菜单所显示的倒计时。

不知哪位高手能解?
第5楼 chenhui530 发表于 2006-04-09 13:14
高级用户 发帖 273 积分 772
w.bat可以
第6楼 martin325 发表于 2006-04-09 13:27
银牌会员 发帖 603 积分 1,582
最好是不用第三方工具。

用批处理来调用DOS本身的倒计时功能!
第7楼 willsort 发表于 2006-04-09 19:12
元老会员 发帖 1,512 积分 4,432
Re martin325:

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

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

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

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



[ Last edited by willsort on 2006-4-10 at 12:28 ]
第8楼 martin325 发表于 2006-04-09 19:59
银牌会员 发帖 603 积分 1,582
不知显示30秒倒计时,可否把
if "%1"=="" %0 : 9 8 7 6 5 4 3 2 1

改为
if "%1"=="" %0 : 29 28 27 26 …………
第9楼 martin325 发表于 2006-04-09 20:26
银牌会员 发帖 603 积分 1,582
刚刚测试了,发现没有达到预期效果,屏幕提示:

Invalid time
Enter new time
第10楼 martin325 发表于 2006-04-10 00:00
银牌会员 发帖 603 积分 1,582
为什么config.sys能用MSDOS自身的计时器,而批处理不能调用呢?

请高手研究一下!
第11楼 willsort 发表于 2006-04-10 12:28
元老会员 发帖 1,512 积分 4,432
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本身应该并未提供可供调用的倒计时显示中断或函数。因此,批处理仍然需要借用其它命令或程序中的类似功能来替代性实现。
第12楼 voiL 发表于 2006-04-10 12:53
中级用户 发帖 189 积分 384
我之前也曾在论坛上找过相关的资料,但没有找到现成的,所以就自己东拼西凑的"凑"了个出来...

在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楼 willsort 发表于 2006-04-10 13:11
元老会员 发帖 1,512 积分 4,432
[求助]如何将键盘的输入字符直接送入某变量作为选择项
Re voiL:

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

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

第14楼 martin325 发表于 2006-04-10 20:38
银牌会员 发帖 603 积分 1,582
这个循环批处理中有“CLS”,目的使“echo 当前选择时间: %i%”始终在屏幕同一地方显示,但就是这个清屏命令,把本人认为应该给使用者的一些屏幕提示也一起清除了,呵呵,这个问题该如何解决?
第15楼 martin325 发表于 2006-04-10 20:41
银牌会员 发帖 603 积分 1,582
现在需要解决两个问题:

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

二是让倒计时显示始终在屏幕同一处显示
1 2 3  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023