[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[转贴] 浅谈批处理脚本的编写 - 5.可读性篇

5.可读性篇
  如果代码要用于交流,首先要让人能看得懂,也就是要注意可读性,可读性好的代码看起来很舒服,用得明白,可读性差的代码晦涩难懂,让人不想往下看,日后可能自己都看不懂了。
  提升可读性的代价往往是降低简洁度,就像提升运行效率的代价往往是降低编写效率,这个矛盾是很难调和的,其中的权重要根据实际需求而定,并非一定要分个孰优孰劣。
  当然咯,如果仅用于解决问题,日后也不打算再做修改,那么没有必要太纠结于可读性,毕竟要提升可读性是很费脑子的,闹个对牛弹琴确实不太值得。
5.1 外观
5.1.1 缩进排版
【code1】
  1. @echo off
  2.    for /l %%a in (1 1 9) do (
  3. for /l %%b in (0 1 9) do (
  4. if %%a%%b000 gtr 12233 (
  5. echo gtr
  6.   ) else (
  7. echo lss)))
  8. ::效果是当 %%a%%b000 大于 12233 时显示 gtr 否则显示 lss,%%a%%b的范围是 10~99
  9. ::欠揍吗?如果用这样的代码参加笔试,肯定第一个被毙掉。
复制代码
【code2】
  1. @echo off
  2. for /l %%a in (1 1 9) do (
  3.    for /l %%b in (0 1 9) do (
  4.       if %%a%%b000 gtr 12233 (
  5.          echo gtr
  6.       ) else (
  7.          echo lss
  8.       )
  9.    )
  10. )
  11. ::现在很美观易懂了吧?
复制代码
5.1.2 嵌套层次明晰
【code1】
  1. @echo off
  2. set date=%date:/=-%
  3. if "%date%" gtr "2011-12-16" if "%time%" lss "20:00:00" (echo 早了) else echo 晚了
  4. ::当日期超过 2011-12-16 时,早于 20 点显示“早了”,否则显示“晚了”
  5. ::是不是看着很累。。。。
复制代码
【code2】
  1. @echo off
  2. set date=%date:/=-%
  3. if "%date%" gtr "2011-12-16" (
  4.    if "%time%" lss "20:00:00" (
  5.       echo 早了
  6.    ) else (
  7.       echo 晚了
  8.    )
  9. )
  10. ::当日期超过 2011-12-16 时,早于 20 点显示“早了”,否则显示“晚了”
复制代码
5.2 用注释介绍思路
【code1】
  1. set/ac=(b+=p=1)*100/(a=2000)+(n=0)
  2. ::这个看得懂吗?晕了吧?
复制代码
【code2】
  1. set/ac=(b+=p=1)*100/(a=2000)+(n=0)
  2. rem 相当于 set /a p=1,b+=p,a=2000,n=0,c=b*100/a+n,利用 set /a 中符号的优先级实现简写
  3. ::这样看懂了吗?
复制代码
【code1】
  1. @echo off&setlocal enabledelayedexpansion
  2. set str=@abcdefghijklmnopqrstuvwxyz
  3. for %%a in ("" -) do (
  4.    for /l %%b in (1 1 26) do echo !str:~%%~a%%b,1!
  5. )
  6. pause
  7. ::先输出 a~z,再输出 z~a,这个有点难理解吧。。。
复制代码
【code2】
  1. @echo off&setlocal enabledelayedexpansion
  2. set str=@abcdefghijklmnopqrstuvwxyz
  3. rem 顺序保存 26 个字母在 %str% 中,并且由于后文无法以 !str:-0,1! 的方式引用 a,所以在前面补一个 @,以便用 !str:-1,1! 来引用 a
  4. for %%a in ("" -) do (
  5.    rem 用 %%~a 来控制变量偏移的方向,先正后负
  6.    for /l %%b in (1 1 26) do echo !str:~%%~a%%b,1!
  7.    rem 从 1 循环到 26,输出对应位的字母,当 %%a 为 "" 时,%%~a为空按默认的从左往右取值,而当 %%a 为 - 时,将从右往左取值
  8. )
  9. pause
  10. ::注释功不可没吧?
复制代码
5.3 少用不常见的写法
【code】
  1. ec%undefined%ho;sdf^|f^
  2. sd^ d^s&p^au^se fsdfsdf
  3. ::其实就是一句 echo;sdf|fsd ds  & pause fsdfsdf
  4. ::只是这里利用了空变量、转义符在转义后消失、行尾 ^ 实现换行、pause 接受但忽略任何参数这几个特性构造了一段晦涩难懂的代码。
  5. ::因为我们很少这么用,所以看着就别扭,就像象棋中炮的惯例是记载为炮二平五,比赛时为了让对手别扭,有些选手会故意左右翻转改为炮八平五,对手措手不及之下有时会记错局面发挥失常。
复制代码
【code】
  1. for,/l;%%a;in,(0x7f=-1)do echo %%a
  2. ::常见的写法是 for /l %%a in (127 -1 0) do echo %%a,从 127 逐步减一到 0
  3. ::我们见惯了以空格作为分隔符的 for,突然换一个写法就感觉十分不习惯
  4. ::这里的 ;、,、=、空格、制表符 都是 for 语句的默认分隔符
  5. ::而 for /l 以 start step end 的顺序逐个读取参数,不足的参数补为 0,超出 3 个的参数被忽略,并且能够接受十六进制和八进制数。
  6. ::for 语句中,do 前是可以不带分隔符直接与 ) 相连的,类似的还有 if 中的 else,这技巧常用于简化函数,但是对大部分人而言是会造成水土不服的。
复制代码


转自:http://tieba.baidu.com/p/1326841218

  1. @echo off
  2. for /l %%a in (1 1 9) do (
  3.    for /l %%b in (0 1 9) do (
  4.       if %%a%%b000 gtr 12233 (
  5.          echo gtr
  6.       ) else (
  7.          echo lss
  8.       )
  9.    )
  10. )
复制代码
  1. @echo off
  2. for /l %%a in (1 1 9) do (
  3.    for /l %%b in (0 1 9) do (
  4.       if %%a%%b000 gtr 12233 (echo gtr) else (echo lss)
  5.   )
  6. )
复制代码
我觉得这样更好理解
本人已死!不用联系!~
要联系下来联系!~~

TOP

回复 2# jellyhk


可能因为你不是程序员

TOP

关于可读性,我分享一些个人的经验:
第一、添加注释。在每个程序开头注释清楚程序的名称、版本、作者、出处、作用、特点等等很必要,小程序可忽略。同时在每个标签后面、下面等位置添加注释,注明作用。并且建议,在命令内部用rem注释,外部用::注释。注释要简洁,不能啰嗦,当然也不必晦涩难懂。
第二、遇到for、if等命令嵌套时,懂得用缩进及括号,这个就不详述了。
第三、认真调整echo出来的内容。
第四、在可能出错的地方、或者比较怪异的地方、要注意的地方,必须添加注释。
第五、将那些重复了三次以上的代码独立成标签来引用,注明标签下代码的功能。
第六、必要的代码分割线。当程序代码比较多(超过一百行)分块分段时,最好用代码分割线将各段代码分割出来,方便查找。适当的情况下应多加几行空格。可以在代码分割线中间添加主要标题。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

回复 4# cjiabing


据说::不如rem好,统一用rem就行啦。

TOP

回复 5# HAT


    ::是一种投机取巧的写法,考虑到向后兼容性在书写大量代码时最好使用REM。

TOP

除非故意书写具有迷惑性或加密代码,否则在书写大量代码时应遵循一定的约定。
1.标识符命名
2 使用注释
3 使用缩进

在有些变成语言中,必须使用缩进;而且缩进已经成为语法的一部分。
比如,python,使用缩进来表示逻辑结构,错误的缩进会产生错误。

TOP

返回列表