中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [原创]批处理学习帖④ 退格符在批处理中的应用
作者:
标题: [原创]批处理学习帖④ 退格符在批处理中的应用 上一主题 | 下一主题
q8249014
初级用户





积分 175
发帖 45
注册 2007-8-4
状态 离线
『楼 主』:  [原创]批处理学习帖④ 退格符在批处理中的应用

批处理学习帖④ —— ASCII 08 号字符 退格符在批处理中的应用

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

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

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

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

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

一、理论讲解
@echo off
:: 代码1
set/p=?
pause
执行代码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窗口中输入一些内容,看一下“?”是不是没有了?
@echo off
:: 代码2
set/p=?*
pause
作业:运行一下代码2,再结合上面的分析,自行分析一下代码2

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

中显示的“?”是一个轨迹
@echo off
:: 代码3
>"%~dp0test_.txt" <nul set/p=?
edit "%~dp0test_.txt"
代码3将内容输出到文本中,没有经过cmd窗口(控制台),所有就没有处理退格符,大家执行下试试

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

二、实例演示

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

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

网络上也流传过一个使用VBS脚本进行处理版本的,也不会出现震动的感觉
@echo off
mode con cols=80 lines=25
title 搞笑开机 Code by q8249014
echo. Microsoft Windows 2000 [Version 5.00.2195]
echo. (C) 版权所有 1985-2000 Microsoft Corp.
echo.
for %%i in (开机 快开机 他妈的快开机 他妈的到底开不开机 操,再不开机老子砸了你) do (
    set "str=%%i"
    <nul set/p"= %cd%>"
    call :display
    if %%i neq 操,再不开机老子砸了你 (
       echo. '%%i' 不是内部或外部命令,也不是可运行的程序
       echo. 或批处理文件。
       echo.
    )
)

echo.
echo.                             loading windows2000...
<nul set/p"= =============================================================================="
for /l %%i in (1 1 78) do (<nul set /p=)
for /l %%i in (1 1 78) do (
    <nul set/p"=>"
    cd|set/p=
)
echo.&pause

:display
  for /l %%i in (1 1 5) do (cd|set/p=)
  if defined str (
     <nul set/p=%str:~0,1%
     set "str=%str:~1%"
     goto display
  )
  echo.
goto :eof
2.本论坛中bagpipe写的“幻影”特效
@echo off&setlocal enabledelayedexpansion&cls&color 0f&title Welcome to CN-DOS!
:: Code by CN-DOS bagpipe
mode con: cols=30 lines=3
set "a=                            CN-DOS"
set "b="
set "c=12345689abcde"
echo\
:c
for /l %%a in (6,1,28) do (
set /a d=%random%%%13+1
call :pp %%a
)
goto c
:pp
set/p=!a:~-%1!<nul
set/p=!b:~0,%1!<nul
color 0!c:~%d%,1!
goto :eof
3.下面这段代码也是本论坛中bagpipe写的“星星”特效,代码中“color 0!e:~%f%,1!”这一句有些错误不

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

“call color 0%%e:~!f!,1%%” 和 “set /a f=!random!%%14+1”
@echo off&setlocal enabledelayedexpansion&title *一个眺望摩天轮的人*
:: Code by CN-DOS bagpipe
mode con cols=30 lines=7
set a=☆☆☆☆☆☆☆☆☆☆
set b=★
set c=
set d=
set e=123456789abcde
echo/
echo **********(D--O--S)***********
echo  *Welcome to China Dos Union*
echo\
:b
for /l %%a in (0,1,9) do (
set /a f=%random%%%14+1
set/p=!a:~%%a,1!<nul&set/p=%b%<nul
ping -n 1 127.1>nul
color 0!e:~%f%,1!
set/p=%c%<nul
if %%a equ 9 (set/p=%d%<nul&for /l %%a in (9,-1,1) do (set/p=!a:~-%%a!!<nul&set/p=%b%<nul&ping -n 1 127.1>nul&set/p=%d%<nul))
)
goto b
4.下面这个是我仿写bagpipe的“幻影”特效,同学们比较一下有什么不同
@echo off
:Code by q8249014
title Welcome to CN-DOS!
mode con: cols=30 lines=3
set "n=123456789abcdef"
echo.
:test
  set/a r=%random%%%15
  call color 0%%n:~%r%,1%%
  for /l %%i in (1 1 22) do (
      <nul set/p"= CN-DOS"
  )
  <nul set/p=
goto test
5.下面这段代码也是本论坛中bagpipe写的“星星”特效,还是按照bagpipe的写法,我对这段代码进行

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

但是还是贴出来让同学们比较一下
@echo off&title *一个眺望摩天轮的人*
:: Code by CN-DOS bagpipe
:: Modified by q8249014
mode con cols=30 lines=7
set a=☆☆☆☆☆☆☆☆☆☆☆☆☆☆
set b=
set c=123456789abcdef
echo.
echo.**********(D--O--S)***********
echo.*Welcome to China Dos Union*
echo.
:b
set/a d=%random%%%15
call color 0%%c:~%d%,1%%
for /l %%i in (1 1 14) do (
    <nul set/p=☆
    cd|set/p=
)
<nul set/p=%b%
for /l %%i in (14 -1 1) do (
    call <nul set/p=%%a:~-%%i%%★
    cd|set/p=
    <nul set/p=%b%
)
goto b
6.下面是不同的几种“星星”显示效果

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

这个代码同学们可以和上面那段比较一下
@echo off&title *一个眺望摩天轮的人*
:: Code by CN-DOS q8249014
mode con cols=30 lines=7
set a=123456789abcdef
echo.
echo.**********(D--O--S)***********
echo.*Welcome to China Dos Union*
echo.
:b
set/a b=%random%%%15
call color 0%%a:~%b%,1%%
<nul set/p=
for /l %%i in (1 1 14) do (
    <nul set/p=☆
    cd|set/p=
)
<nul set/p=★
for /l %%i in (1 1 13) do (
    <nul set/p=★
    cd|set/p=
)
goto b

@echo off&title *星星效果1*
:: Code by CN-DOS q8249014
mode con cols=30 lines=7
set a=123456789abcdef
echo.
echo.**********(D--O--S)***********
echo.*Welcome to China Dos Union*
echo.
:b
set/a b=%random%%%15
call color 0%%a:~%b%,1%%
<nul set/p=
for /l %%i in (1 1 14) do (
    <nul set/p=☆
    cd|set/p=
)
for /l %%i in (1 1 12) do (
    <nul set/p=★
    cd|set/p=
)
goto b

@echo off&title *星星效果2*
:: Code by CN-DOS q8249014
mode con cols=30 lines=7
set a=123456789abcdef
echo.
echo.**********(D--O--S)***********
echo.*Welcome to China Dos Union*
echo.
:b
set/a b=%random%%%15
call color 0%%a:~%b%,1%%
<nul set/p=
for /l %%i in (1 1 13) do (
    <nul set/p=☆★
    cd|set/p=
)
<nul set/p=☆
for /l %%i in (1 1 12) do (
    <nul set/p=★☆
    cd|set/p=
)
goto b
9.幻影 and 走马灯
@echo off
:: Code by CN-DOS q8249014
title Welcome to CN-DOS!
mode con: cols=30 lines=3
set/p "query= A.幻影 B.走马灯 [A|B]?"&cls
if /i "%query%" equ "b" (set "var=cd|set/p=|set/p=") else (if "%query%" neq "a" %0)
set "n=12345689abcdef"
echo.
:test
  set/a r=%random%%%15
  call color 0%%n:~%r%,1%%
  for /l %%i in (1 1 22) do (
      <nul set/p"= CN-DOS"
      %var%
  )
  <nul set/p=
goto test

@echo off&color 0b
title 退格字符演示 Code by q8249014
set "速度=for /l %%i in (1 1 5) do (cd|set/p=)"
:: for /l %%i in (25 -1 6) do (mode con lines=%%i cols=80&%速度%)
:: for /l %%i in (80 -1 70) do (mode con lines=6 cols=%%i&%速度%)
mode con cols=70 lines=6
set "var= http://www.???.net 咦!中国dos联盟的网址是多少了?哦,对想起来了!www.cn-dos.net"
for /l %%i in (0 1 59) do (
    call <nul set/p=%%var:~%%i,1%%
    %速度%
    if %%i equ 44 (
       for /l %%i in (0 1 57) do (
           <nul set/p"= "
           %速度%
       )
    )
)
echo.
echo.                          loading CN-DOS...
<nul set/p"= ===================================================================="
for /l %%i in (1 1 68) do (<nul set /p=)
for /l %%i in (1 1 68) do (
    <nul set/p"=>"
    cd|set/p=
)
echo.&echo.
echo. 欢迎来到中国dos联盟学习
pause>nul
这一节给出的演示代码较多一些,一共10个,其中有几个基本上都是一样的,只是为了演示不同的效果

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

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


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

[ Last edited by q8249014 on 2010-1-17 at 18:45 ]

   此帖被 +6 点积分      点击查看详情   
评分人:【 vsbat 分数: +1  时间:2009-12-4 22:01
评分人:【 huahua0919 分数: +5  时间:2009-12-18 18:38


2009-12-3 19:32
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
740011611
初级用户





积分 96
发帖 83
注册 2009-6-4
来自 信阳
状态 离线
『第 2 楼』:  

cd|set/p=
set/a b=%random%%%15
分别是什么意思?

2009-12-18 18:14
查看资料  发送邮件  发短消息 网志  OICQ (740011611)  编辑帖子  回复  引用回复
q8249014
初级用户





积分 175
发帖 45
注册 2007-8-4
状态 离线
『第 3 楼』:  

cd|set/p=  [延时]

set/a b=%random%%%15  [取余]--[产生随机数]

2010-1-17 18:44
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
explor
初级用户





积分 30
发帖 14
注册 2010-10-6
状态 离线
『第 4 楼』:  

set/p"= CN-DOS"
这一句里等号在引号外和引号内完全是不同的结果,这是为什么?

2010-10-24 19:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: