『楼 主』:
[原创]批处理学习帖④ 退格符在批处理中的应用
批处理学习帖④ —— 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 ]
|