中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-12 02:31
47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,256 会员排行
DOS批处理 & 脚本技术(批处理室) » [原创]批处理学习帖④ 退格符在批处理中的应用
可打印版本  1,895 / 3
第1楼 q8249014 发表于 2009-12-03 19:32
初级用户 发帖 45 积分 175
[原创]批处理学习帖④ 退格符在批处理中的应用
批处理学习帖④ —— ASCII 08 号字符 退格符在批处理中的应用

这里讲解一下 ASCII 08 号字符 退格符在批处理中的应用,也算是给大家补充讲解一下“文本阅读器”

中的“<nul set /p= !str:~0,1!”这一段代码是怎样做到兼容输出等号和引号的

为了方便理解,这里我把“文本阅读器”中退格符“”前面的空格替换为“?”

因为空格符号在即使在屏幕中输出了,大家也看不到,所以用“?”代替一下

“原创文章,转帖请注明出处cn-dos&q8249014哦”

一、理论讲解



执行代码1输出结果显示为“?”

不是说“”可以删除它前面的“?”吗?那么输出的结果应该为空啊,可为什么代码执行完毕输出结果还显示“?”呢?

我们首先来分析一下代码1的执行过程

(1).当cmd读取完毕“set/p=?"”这条语句后,进行一些必要的预处理工作
(2).把命令语句提交给set执行
(3).set命令在对这些语句进行处理
(4).命令得到执行,将结果返回到cmd窗口中(控制台)“?”
(5).这时cmd窗口接收到“”,就相当于按了一次退格,但是窗口中任然显示“?”

在ASCII字符中退格符、换行符和回车符都没有图形表示,不同的应用程序在接收到这些字符后都会进行相应的处

理,比如记事本、word,而输出到cmd窗口(控制台)中的内容也属于文本文字,所以当cmd窗口接收到“”退格字

符后默认也会对它进行相应的处理。如果不输出到cmd窗口(控制台)退格符就不会被处理。


现在你可以打开一个记事本,输入一个字符,然后按住alt键不放再按数字键盘上的0和8然后松开alt键,怎么样,

输入的字符被删除了吧,其实这时候记事本将你“按alt键……”输入的字符当作退格处理了


好,下面回到主题。

在以上过程的第4步中,cmd接收到了“?”,这时实际显示为“?”,同上,由于退格符的特殊性cmd会对他进行处理,

理论上应该是删除掉前面的字符“?”,但是请注意cmd处理完毕“”退格符后,cmd窗口就

再也没有接收到其他可显示的字符,所以cmd窗口没有被刷新,那么窗口中自然显示的还是“?”,也就是说cmd窗口中

显示的内容是第4步运行完毕的轨迹。

好,请同学们在运行一下代码1,然后随便在cmd窗口中输入一些内容,看一下“?”是不是没有了?



作业:运行一下代码2,再结合上面的分析,自行分析一下代码2

细心的同学可能还会发现,代码1和代码2执行后闪动的光标在cmd窗口中的位置都不一样,这就更好的解释了代码1

中显示的“?”是一个轨迹



代码3将内容输出到文本中,没有经过cmd窗口(控制台),所有就没有处理退格符,大家执行下试试

同学们想想看,我为什么不用记事本打开“test_.txt”让大家查看而用“edit”呢? 提示:文件头?Unicode

二、实例演示

“原创文章,转帖请注明出处cn-dos&q8249014哦”

1.这个搞笑开机不同于网上流传的那种,因为没有使用cls命令,所以不会出现震动的感觉

网络上也流传过一个使用VBS脚本进行处理版本的,也不会出现震动的感觉



2.本论坛中bagpipe写的“幻影”特效



3.下面这段代码也是本论坛中bagpipe写的“星星”特效,代码中“color 0!e:~%f%,1!”这一句有些错误不

过由于goto的存在变色倒是没有什么问题 ,要想观看另一种变色效果应修改两处代码,正确的代码应改为

“call color 0%%e:~!f!,1%%” 和 “set /a f=!random!%%14+1”



4.下面这个是我仿写bagpipe的“幻影”特效,同学们比较一下有什么不同



5.下面这段代码也是本论坛中bagpipe写的“星星”特效,还是按照bagpipe的写法,我对这段代码进行

了一些简单的“修整”,使显示效果更好一些,同时也增加了星星的数量。这段代码写的还是有点繁琐,

但是还是贴出来让同学们比较一下



6.下面是不同的几种“星星”显示效果

为了方便阅读 统一采用以下这种格式编写

这个代码同学们可以和上面那段比较一下







9.幻影 and 走马灯





这一节给出的演示代码较多一些,一共10个,其中有几个基本上都是一样的,只是为了演示不同的效果

而有一点区别,同学们举一反三,还可以写出更好玩的代码。

以上所有的代码中,同学们可以选择一个自己感兴趣的代码分析一下


“原创文章,转帖请注明出处cn-dos&q8249014哦”

[ Last edited by q8249014 on 2010-1-17 at 18:45 ]
第2楼 740011611 发表于 2009-12-18 18:14
初级用户 发帖 83 积分 96 来自 信阳
cd|set/p=
set/a b=%random%%%15
分别是什么意思?
第3楼 q8249014 发表于 2010-01-17 18:44
初级用户 发帖 45 积分 175
cd|set/p= [延时]

set/a b=%random%%%15 [取余]--[产生随机数]
第4楼 explor 发表于 2010-10-24 19:56
初级用户 发帖 14 积分 30
set/p"= CN-DOS"
这一句里等号在引号外和引号内完全是不同的结果,这是为什么?
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023