中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 批处理中如何让文字滚动显示
作者:
标题: 批处理中如何让文字滚动显示 上一主题 | 下一主题
wuyun8035
初级用户





积分 48
发帖 17
注册 2007-2-11
状态 离线
『楼 主』:  批处理中如何让文字滚动显示

求:批处理中如何让文字滚动显示

2007-2-11 11:53
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 2 楼』:  

@echo off
:Head
cls
setlocal EnableDelayedExpansion

    set line="我是要循环的字~我的长度是15"
    for /l %%i in (0,1,15) do (
        set /p=!line:~%%i,1!<nul
        ping/n 2 127.1>nul
)
goto Head

   此帖被 +8 点积分        点击查看详情   
评分人:【 anqing 分数: +8  时间:2007-2-12 12:57


2007-2-11 12:26
查看资料  发短消息 网志   编辑帖子  回复  引用回复
czwlay
初级用户





积分 94
发帖 35
注册 2007-1-9
状态 离线
『第 3 楼』:  

真精彩!
这句:set /p=!line:~%%i,1!<nul能不能讲解一下?

2007-2-11 14:20
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 4 楼』:  



  Quote:
Originally posted by willsort at 2006-1-21 09:37:

无奈何签名代码略析



set/p= %line:~%i,1%<nul

      这是 for 语句块中的第一句代码,目的是根据替换变量 %i 从环境变量 %,% 中取出对应的字符,结合 for 的控制部分,即实现了签名串的逆序逐字显示。@的作用在于禁止其后的 call 语句在命令行中回显,因为 for 语句会创建一个新的命令运行环境来执行循环体中的多条语句,而在这个新环境中命令行回显是开启的。而 call 则实现了命令行转义字符 % 的二次替换:在 for 创建的新环境中依次替换 %i 为 22 到 0 这 23 个数字,在 call 再次创建的新环境中依次再替换 %,:~22,1% 至 %,:~0,1% 为签名串中的每个字符。

      至于命令行如何分析出现的多个转义字符 % 及其所夹杂的替换变量、环境变量和命令行参数,这主要取决于“左侧优先于右侧”、“可替换优先于无可替换”这两个原则,再加上环境变量的延迟替换特性,请读者慢慢自行体会。

      于是,这一句代码就最终替换为“set/p= (某个签名字符)<nul”,/p 的作用是将签名字符当作询问环境变量值的提示语输出,而这个环境变量是没有名字的,所以将不会有环境变量被保存。至于为何不用 echo 来显示字符,是因为 set/p 不会在显示完字符串后再显示一个换行,这样可以使所有的签名字符显示在一行而非一列上;= 后的空格是可以省略的,它显示在每个字符前,因此会增加字符间距,改进显示效果;<nul 则负责满足 set/p 所等待的输入,< 将 set/p 的输入设备由标准的控制台(CON,通常为键盘+屏幕)重定向为空设备(NUL),虽然它并不是一个实际存在的硬件设备,而只是一个软件意义上的概念,但它会像宇宙中的黑洞一样,“吞噬”所有指向它的输入流和输出流,在这里, set/p 的输入需求也被“吞噬”,因此它不会停下来等待用户的输入了。

http://www.cn-dos.net/forum/viewthread.php?tid=27430&fpage=3

[ Last edited by slore on 2007-2-11 at 02:08 PM ]

2007-2-12 03:05
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wuyun8035
初级用户





积分 48
发帖 17
注册 2007-2-11
状态 离线
『第 5 楼』:  

很精彩,谢谢3楼的精彩解答

2007-2-12 10:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
q1a2z3q1a2z3
初级用户





积分 88
发帖 41
注册 2006-5-13
状态 离线
『第 6 楼』:  

不得不服

2007-3-13 02:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
ebing
初级用户




积分 130
发帖 12
注册 2003-10-22
状态 离线
『第 7 楼』:  

非常感谢slore的精彩阐述,卷走了,谢谢!

2007-3-13 05:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jackyggt
初级用户





积分 76
发帖 38
注册 2007-3-13
状态 离线
『第 8 楼』:  

顶哈子

2007-3-13 08:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ZJHJ
高级用户





积分 609
发帖 374
注册 2006-8-2
状态 离线
『第 9 楼』:  

精练

2007-3-13 10:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
zh159
金牌会员




积分 3687
发帖 1467
注册 2005-8-8
状态 离线
『第 10 楼』:  

不用计算字符长度
@echo off
set "str=我是要循环的字,长度自定。"

:loop
set /p=%str:~0,1%<nul
set "str=%str:~1%"
ping/n 2 127.1>nul
if not "%str%" == "" goto loop
echo.
pause
exit


2007-3-13 12:18
查看资料  发短消息 网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: