中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 在批处理中,如何显示倒计时?
« [1] [2] [3] »
作者:
标题: 在批处理中,如何显示倒计时? 取消高亮 | 上一主题 | 下一主题
martin325
银牌会员





积分 1582
发帖 603
注册 2006-2-20
状态 离线
『楼 主』:  在批处理中,如何显示倒计时?

当用Choice设定延时命令时间后,如何在批处理中实现这个时间的倒计时显示?

请教了:)

2006-4-8 21:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
martin325
银牌会员





积分 1582
发帖 603
注册 2006-2-20
状态 离线
『第 2 楼』:  

顺计时也可:)

2006-4-8 22:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
martin325
银牌会员





积分 1582
发帖 603
注册 2006-2-20
状态 离线
『第 3 楼』:  

在网上搜索到的一个批处理如下:

以下面的格式运行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行!

2006-4-9 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
martin325
银牌会员





积分 1582
发帖 603
注册 2006-2-20
状态 离线
『第 4 楼』:  

最好有像Config.sys启动菜单所显示的倒计时。

不知哪位高手能解?

2006-4-9 12:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
chenhui530
高级用户





积分 772
发帖 273
注册 2004-10-23
状态 离线
『第 5 楼』:  

w.bat可以



http://www.msfans.net/bbs/
2006-4-9 13:14
查看资料  发送邮件  发短消息 网志  OICQ (77740821)  编辑帖子  回复  引用回复
martin325
银牌会员





积分 1582
发帖 603
注册 2006-2-20
状态 离线
『第 6 楼』:  

最好是不用第三方工具。

用批处理来调用DOS本身的倒计时功能!

2006-4-9 13:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 7 楼』:  

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:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-4-9 19:12
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
martin325
银牌会员





积分 1582
发帖 603
注册 2006-2-20
状态 离线
『第 8 楼』:  

不知显示30秒倒计时,可否把
if "%1"=="" %0 : 9 8 7 6 5 4 3 2 1

改为
if "%1"=="" %0 : 29 28 27 26 …………

2006-4-9 19:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
martin325
银牌会员





积分 1582
发帖 603
注册 2006-2-20
状态 离线
『第 9 楼』:  

刚刚测试了,发现没有达到预期效果,屏幕提示:

Invalid time
Enter new time

2006-4-9 20:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
martin325
银牌会员





积分 1582
发帖 603
注册 2006-2-20
状态 离线
『第 10 楼』:  

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

请高手研究一下!

2006-4-10 00:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 11 楼』:  

Re martin325:

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

Invalid time
Enter new time

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

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

config.sys的倒计时由io.sys提供支持,而io.sys则是用汇编实现,算法应该是反复读取系统时钟。DOS本身应该并未提供可供调用的倒计时显示中断或函数。因此,批处理仍然需要借用其它命令或程序中的类似功能来替代性实现。



※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-4-10 12:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
voiL
中级用户





积分 384
发帖 189
注册 2005-10-19
状态 离线
『第 12 楼』:  

我之前也曾在论坛上找过相关的资料,但没有找到现成的,所以就自己东拼西凑的"凑"了个出来...

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

  Quote:
@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



2006-4-10 12:53
查看资料  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 13 楼』:  [求助]如何将键盘的输入字符直接送入某变量作为选择项

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:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-4-10 13:11
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
martin325
银牌会员





积分 1582
发帖 603
注册 2006-2-20
状态 离线
『第 14 楼』:  

这个循环批处理中有“CLS”,目的使“echo 当前选择时间: %i%”始终在屏幕同一地方显示,但就是这个清屏命令,把本人认为应该给使用者的一些屏幕提示也一起清除了,呵呵,这个问题该如何解决?

2006-4-10 20:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
martin325
银牌会员





积分 1582
发帖 603
注册 2006-2-20
状态 离线
『第 15 楼』:  

现在需要解决两个问题:

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

二是让倒计时显示始终在屏幕同一处显示

2006-4-10 20:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] [3] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: