中国DOS联盟论坛

中国DOS联盟
-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:bbs.cn-dos.net

DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

» 游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助

 

<   <<   [1] [2] [3] [4] [5]  >>   >
作者:
标题: 无奈何签名代码略析 上一主题 | 下一主题
lxmxn
版主




积分 11384
发帖 4938
注册 2006-7-23
状态 离线
『第 16 楼』:  


  与其说无奈何兄的签名厉害,不如说willsort兄的讲解更精彩…………=_=


2006-10-20 00:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
jieok3375
中级用户





积分 282
发帖 130
注册 2006-9-20
来自 广东
状态 离线
『第 17 楼』:  

学习了……



~~~~好好学习
              天天向上~~~~
2006-10-20 00:36
查看资料  发送邮件  发短消息 网志  QQ   编辑帖子  回复  引用回复
chenall
银牌会员




积分 1276
发帖 469
注册 2002-12-23
来自 福建泉州
状态 离线
『第 18 楼』:  

经测试13楼的代码,无法正常显示中文.



QQ:366840202
http://chenall.net
2006-10-26 05:29
查看资料  发送邮件  访问主页  发短消息 网志  QQ   编辑帖子  回复  引用回复
chenall
银牌会员




积分 1276
发帖 469
注册 2002-12-23
来自 福建泉州
状态 离线
『第 19 楼』:  

13楼的思路不错.
type %1 | find "" /V /N | findstr "^\[[0-9]*\]$" >C:\_tmp_.txt
可以考虑使用.
findstr /n "^$" %1 >C:\_tmp_.txt
再修改一下代码就完美了.



QQ:366840202
http://chenall.net
2006-10-26 05:42
查看资料  发送邮件  访问主页  发短消息 网志  QQ   编辑帖子  回复  引用回复
chenall
银牌会员




积分 1276
发帖 469
注册 2002-12-23
来自 福建泉州
状态 离线
『第 20 楼』:  

利用13楼的思路,编写了这个版本.
总算解决了空行的问题.
应该可以算是最终完美版了吧.
CODE:  [Copy to clipboard]
@echo off
findstr /n "^$" %1 >~tmp.shw
find ":" ~tmp.shw 1>nul 2>nul||del ~tmp.shw
set /A "turn=1"
for /f "usebackq delims=" %%l in (%1) do (
        if exist ~tmp.shw call :space
        set line=%%l
        call :show
        set /A "turn+=1"
        echo.)
del ~tmp.shw
pause
goto :EOF

:show
setlocal EnableDelayedExpansion
for /l %%i in (0,1,9999) do (
    if "!line:~%%i,1!"=="" goto :EOF
    set /p= !line:~%%i,1!<nul
    ping/n 1 127.1>nul
)
goto :EOF

:space
    findstr "^%turn%:$" ~tmp.shw>nul && (
        echo.
        set /A "turn+=1"
        goto :space
    )
goto :EOF




QQ:366840202
http://chenall.net
2006-10-26 06:10
查看资料  发送邮件  访问主页  发短消息 网志  QQ   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 21 楼』:  

这么精彩的又内容欣赏了一遍,哈哈……

[ Last edited by redtek on 2006-11-6 at 10:42 PM ]



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-6 22:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yuanzijia08
初级用户





积分 78
发帖 30
注册 2006-6-17
来自 湖南湘潭
状态 离线
『第 22 楼』:  

强,,相当强!!!!!
单膝脆地佩服

2006-11-18 11:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yuanzijia08
初级用户





积分 78
发帖 30
注册 2006-6-17
来自 湖南湘潭
状态 离线
『第 23 楼』:  

@echo off & setlocal EnableDelayedExpansion
for /f "delims=" %%l in (%1) do (
    set line=%%l
    for /l %%i in (0,1,80) do (
        set /p=!line:~%%i,1!<nul
        ping/n 1 127.1>nul
    )
    echo.
)
pause


为什么这个代码就不能处理!这样的字符呢   别说因为是特殊字符就不能处理  我希望了解不能处理的内在原因  谢谢

2006-11-18 12:17
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 24 楼』:  



  Quote:
Originally posted by yuanzijia08 at 2006-11-18 00:17:
@echo off & setlocal EnableDelayedExpansion
for /f "delims=" %%l in (%1) do (
    set line=%%l
    for /l %%i in (0,1,80) do (
为什么这个代码就不能处理!这样的字符呢   别说因为是特殊字符就不能处理  我希望了解不能处理的内在原因  谢谢
...

) 你的23楼的这段代码可以运行~:)
  但需要加参数,因为你 “for /f "delims=" %%l in (%1)” 中指定了%1参数为要读取的文件名,
  所以运行上面批处理时必须指定一个要读取的文件名,例如:

  你23楼的代码文件.BAT   要读取的文本文件名.txt

  按照上面方式运行,就可以把读出的文本文件内容以动画方式显示了~:)


) 你将下面内容存成文本文件,然后用你23楼代码运行并读取这个文件。
CODE:  [Copy to clipboard]
我爱北京天安门~:)
我爱伟大的中国~:)
我爱伟大中国所有的pp美眉们~:)~
  把上面内容命令为:   A.TXT

  你的23楼代码.BAT  A.TXT  [回车]

  这样就可以动画显示了~:)


) 23楼代码无法读取含有特殊字符的文本内容,例如:= 这个等号。
  yuanzijia08兄可以先试验上面内容,等没有问题了再考虑写出可以显示特殊特殊号的代码~:)



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-18 22:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 25 楼』:  

另:

) 为什么特殊字符不能处理?

  是因为当试图以 set /p=!line:~%%i,1!<nul 指令显示含有特殊符号(例如=等号)内容时系统会认为错误。

  为什么系统会认为错误?我们可以分解操作来看到错误的原因:
  现在假设 !line:~%%i,1! 取到的一个字符正好是“=”等号,那么就相当于你执行了:

  
CODE:  [Copy to clipboard]
  set /p==<nul
  
  这时候系统会提示:
  
CODE:  [Copy to clipboard]
  C:\TEMP>set /p==
  命令语法不正确。
  
  上面就是运行结果。

  但如果要显示一个“=”等号以及特殊符号呢?
  
CODE:  [Copy to clipboard]
  C:\TEMP>set /p= =<nul
   =
  C:\TEMP>
  
  看上面就可以显示“=”等号了,因为在要显示的“=”等号前面加了个空格的原因~:)

  …………略过n个分析过程…………

  此时候就想一下,如果我前面预先加一个空格,那么再显示文字的时候会怎么样?
  (这个实验请亲自做一下~:)

  …………略过n个分析过程…………

  (实际发现,原来这样达不到要显示的效果,太浪费长度了,哈哈……)
  (怎么办?)
  (再想……)
  (这个时候,会想到,那么怎么才能消掉我多加上的那个空格呢?)
  (这时候就有可能会想起ASCII码特殊控制字符--如何想起来?平时多用,多看这些内容,没看过绝对想不起来)
  (哪些特殊控制字符可以用呢?--如何知道的?全都试过一遍(因为感兴趣就会全试一遍的:)
  (在编程课上或是学C语言的时候也讲过: \n   \t   等特殊控制字符……)
  (回想……)

  (很可能在不断的实验中,突然想起了那个传说中的“退格“字符,那它的ASCII码是多少呢?)

  (在ASCII码表上有)

  (n过过程历过了以后…………会想到,那这个字符“退格”我如何输入它呢?)
  (办法多了,用Debug,用vbs,用edit内的Ctrl+P--等等,这个Ctrl+p如何知道的?)
  (多则n天少则几分钟,试呗,有帮助,或偶然间看到的某个资料上写着这样可以,全是经验总结的过程)

  (然后,下一步怎么办?)
  (退格符可以输入了,可以使用了,如何应用呢?)
  (……经过n步的实验会发现怎么字符全没显示出来,全缩转到一起了?)
  (原来退格又删掉了刚显示的内容……等等……再想……这不就是传说中的动画呢?)

  (经过这些步骤的亲自--一定要亲自全玩过一遍,学会了:
     ASCII码
     特殊控制字符
     显示特殊控制字符
     如何延时
     什么是延时变量
     for的技巧操作
     变量的赋值与如何“分割”与“提取”变量的部分内容
     如何计数
     如何输入特殊控制字符,很有可能连debug的输入特殊字符和简单操作也学会了
     如何读文件…………

     太多了,但这一切光看好看还不行,那只是表面上懂了(这个懂很可以是记忆力在帮你死记住它,而不是透彻)

  yuanzijia08兄自己一个一个试吧,这就是学习和自我了悟的过程~:)
  虽然用五笔字型打字和说话的速度一样,字打多了也累~:D

  



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-18 23:27
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yuanzijia08
初级用户





积分 78
发帖 30
注册 2006-6-17
来自 湖南湘潭
状态 离线
『第 26 楼』:  

非常非常 感谢redtek大哥的解释   解释得这么清楚  真的很谢谢
但我问个问题啊  我在写批处理的时候都是用记事本  像那个响铃符 (就是在CMD下面 输入Ctrl + G 的那个特殊字符)我应该怎么把那符号输入记事本呢

2006-11-19 11:28
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
yuanzijia08
初级用户





积分 78
发帖 30
注册 2006-6-17
来自 湖南湘潭
状态 离线
『第 27 楼』:  

@echo off & setlocal EnableDelayedExpansion
for /f "delims=" %%l in (%1) do (
    set line=%%l
    for /l %%i in (0,1,80) do (
        set /p=!line:~%%i,1!<nul
        ping/n 1 127.1>nul
    )
    echo.
)
pause
上面这个代码 能处理像%这样的字符   但不能处理像!这样的字符

但set /p=!<nul 这个在CMD下面是可以显示为 !的  所以在处理!符号的时候 应该不是set /p=的语法问题   感觉应该是变量延迟方面的问题  我想不出 到底是哪个地方的问题   因为我对变量延迟本来就不太清楚   redtek大哥能给解释下吗

2006-11-19 11:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 28 楼』:  

关于27楼不能显示 “!” 符号的问题,它属于延时变量应用上的问题~:)
当上看上面代码,是赋值中含有“!”符号且这个赋值的范围在延时变量开启的范围之内~:)

至于为什么不能处理“!”,做了个延时变量的演示,运行一下就知道啦~:)
CODE:  [Copy to clipboard]
@echo %dbg% off
:: 延时变量实验~:)


::  开启延时变量
setlocal EnableDelayedExpansion

    set "myname=abcdefg!!!!redtek"
    echo 普通输出: %myname%
    echo 延时变量: !myname!
    echo 能看到引号里的符号吗?“!!!”
    echo.
    pause
    echo.
    echo.

::  关闭延时变量
setlocal disabledelayedexpansion

    set "myname=abcdefg!!!!redtek"
    echo 普通输出: %myname%
    echo 延时变量: !myname!
    echo 能看到引号里的符号吗?“!!!”
    echo.
    pause
运行完上面关于延时变量的演示,就知道了 setlocal EnableDelayedExpansion 并不是可了随便找一个地方放就行了~:)


看完运行完上面的代码,请再仔细揣摩8楼chenall兄的代码,就会明白他为什么要将 setlocal EnableDelayedExpansion 放到一个适合的位置,而不是随便放到代码的开头~:)
可见chenall兄的代码在处理特殊字符以及延时变量的应用上都有着非常深的功底~:)
然后再重新揣摩版主的签名代码,看上去简单的就一两行,但这里面凝缩着多少精华~:)

[ Last edited by redtek on 2006-11-19 at 10:11 AM ]



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-19 23:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 29 楼』:  

) 回复第26楼:)

  关于如何输入特殊控制字符详见如下贴子的:第12、14、15以及全贴~:)

如何用“\-/”表示一个进度状态?
http://www.cn-dos.net/forum/viewthread.php?tid=24347&fpage=1



    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-11-19 23:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2724
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 30 楼』:  





三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2006-11-20 01:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
<   <<   [1] [2] [3] [4] [5]  >>   >
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转:  



[ 联系我们 - 中国DOS联盟 ]


Powered by Discuz! © 2001-2011