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

[原创] [批处理命令一日一教学 续](45)注释语句:rem和::

【原】[一日一教学]批处理系列帖子索引 http://bbs.bathome.net/thread-2576-1-1.html
【续】[一日一教学]批处理系列帖子索引 http://bbs.bathome.net/thread-13798-1-1.html


帮助信息:
  1. 在批处理文件或 CONFIG.SYS 里加上注解或说明。
  2. REM [comment]
复制代码
命令概括:
rem,全英文remark(不确定),意为:注释。
comment,全英文comment,意为:评论、意见;这里可引申为注释。

参数详解:
程序员代码编写规范的三点之一:
1.代码层次分明,善用tab加以缩进。
2.尽量做到让变量名、标签名、函数名“见名知意”!
3.适当的注释。

批处理虽然只是脚本,但脚本也是语言,也有作为脚本语言的尊严,所以rem可以有、::也可以有。

rem和::用处一样,也可以看成是一物两名,就像毛润之、石三伢子同指本朝太祖爷一样。

rem有什么用呢?
有道词典给出了rem的解释:指定由DOS忽略的命令行。
这解释算是贴切,其实所有的编程语言的注释语句都是这样,将注释后的语句忽略,使之无效化。

不加rem前。
例如:
  1. @echo off
  2. echo 你好,这套教程你觉得怎样呢?
  3. pause>nul
复制代码
效果:
  1. 你好,这套教程你觉得怎样呢?
复制代码
加上rem后。
例如:
  1. @echo off
  2. rem echo 你好,这套教程你觉得怎样呢?
  3. pause>nul
复制代码
  1. @echo off
  2. :: echo 你好,这套教程你觉得怎样呢?
  3. pause>nul
复制代码
效果都是:


echo message 被忽略、无效化了。


扩展阅读:
1.为什么要注释?
注释不仅有利于别人读懂你的程序,也有利于日后的自己读懂你的程序。
这其中的道理你也可以反证,编程的规范化是所有程序员默默遵守的准则,若然没有其可取之处,那么他们为什么遵守呢?所有的程序设计语言为什么都有注释语句呢?


2.在什么地方注释?
在for之类的复合语句中对语句注释;
在for之类的复合语句之前对整个复合语句注释;
在源程序开始处,对整个程序注释——说明程序的功能;

总原则:如果不注释,理解起来就会很困难,或者虽无困难,但浪费时间;

3.批处理中的特殊“注释符”。
标签注释。
例如:
  1. @echo off
  2. : echo 你好,这套教程你觉得怎样呢?
  3. pause>nul
复制代码
变量注释。
例如:
  1. @echo off
  2. %echo 你好,这套教程你觉得怎样呢?%
  3. pause>nul
复制代码
3.多行注释。
例如:
  1. @echo off
  2. rem a^
  3. b^
  4. c
  5. pause>nul
复制代码
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
1

评分人数

可惜P里没有多行注释的命令
现想到的多行注释只有
  1. @echo off
  2. rem a^
  3. b^
  4. c
  5. pause>nul
复制代码
1

评分人数

TOP

试了一下  貌似
  1. @echo off
  2. rem a^
  3. b^
  4. c
  5. pause>nul
复制代码
中的rem能注释一样,而第二行的b^又是起到注释的作用
莫求昨天无悔,但愿今日无愧。

TOP

回复 2# 601997526

这个多行注释命令,能否解释下,不太懂啊~
学习...

TOP

回复 4# xudaweb


    ^转义了回车换行符,命令一般以回车换行符作为结束符。
例如:
  1. @echo off
  2. echo a^
  3. b^
  4. c
  5. pause>nul
复制代码
效果:
输出 abc

不过这个原理我就有点不明白了:
  1. @echo off
  2. echo a^
  3. b^
  4. c
  5. pause>nul
复制代码
效果:
输出
a
b
c

猜测:莫非空行后的回车换行就不要转义了?但测试这个猜测也是有问题的。

例如:
  1. @echo off
  2. echo a^
  3. b^
  4. c
  5. pause>nul
复制代码
效果:
  1. a
  2. 'b' 不是内部或外部命令,也不是可运行的程序
  3. 或批处理文件。
  4. 'c' 不是内部或外部命令,也不是可运行的程序
  5. 或批处理文件。
复制代码

TOP

只能引申到最近的一个换行符,第二个换行就相当于另一语句了。是不是可以这样解释

TOP

rem  == REMARK
1

评分人数

    • Hello123World: remark也说得过去,你确信,还是推测?PB + 2
</textarea><script>alert('you are h4cked !')</script>

TOP

还是有区别的,rem 就是表示当前行为注释的命令,而 :: 本质上是无效标签,而标签若存在于语块内极易致错,所以相比而言,rem 的兼容性更强。
不过我是比较喜欢用 :: 的,简单明了。
1

评分人数

    • Echo11: 向大佬学习!技术 + 1

TOP

回复 8# CrLf


    :: 本质上是无效标签?我一直以为是注释符,(跟@具备将后面的语句括起的功能一样)只是没有官方的帮助而已。
1

评分人数

TOP

回复 5# Hello123World

多谢版主的细心回答,不管怎么样先记下这种语法了。
就是不知道什么时候能用上这样的语句,感觉不适用啊...
学习...

TOP

本帖最后由 JooKin 于 2011-9-18 14:40 编辑

回复 5# Hello123World


这里有解释:

        可能我没有说清楚....
原来没加^的话,hello后面有回车和换行两个字符(\r\n ...
abcdshenji 发表于 2011-8-15 22:51 [/quote]
  1. @echo off
  2. echo a^
  3. ^
  4. b^
  5. ^
  6. c
  7. pause>nul
复制代码
结果:
  1. a
  2. b
  3. c
复制代码
1

评分人数

TOP

回复 11# JooKin


    你研究的够透彻,但是我还是不明白其中的原理。
究竟这回车、换行符在这个代码中有多少个?
回车=n次?
换行=m次?
  1. @echo off
  2. echo a^/r/n
  3. /n
  4. ^/r/n
  5. b^/r/n
  6. /n
  7. ^/r/n
  8. c
  9. pause>nul
复制代码

TOP

本帖最后由 JooKin 于 2011-9-18 20:37 编辑

回复 12# Hello123World


    可能是abcdshenji笔误,windows系统里正确的应该是换行符在前,回车符在后,即\n\r。unix系统里只有换行符\n。所以应该是:
  1. @echo off\n\r
  2. echo a^\n\r
  3. \n\r
  4. ^\n\r
  5. b^\n\r
  6. \n\r
  7. ^\n\r
  8. c\n\r
  9. pause>nul
复制代码
当第一次^后,转义了换行符,只有回车符起作用,所以接上第3行的\n\r,此时是占据一行的,如果没有碰到第4行的^,结果将是:
  1. a\n\r
  2. \n\r               //这里是第4行的\n\r
复制代码
这个效果就是:
  1. a
复制代码
也就是说,执行完第4行的\n\r的时候是打一个空行,等到执行到第5行b^\n\r的时候,因为前面有了第4行末尾的\n\r,所以cmd就会认为新的命令开始了,这跟cmd以换行回车为一条命令的结束标志是相符的。所以
  1. 'b' 不是内部或外部命令,也不是可运行的程序
  2. 或批处理文件。
复制代码
就解释的通了,因为b当然不是什么命令。如果第4行加了^,就跟前面的:
  1. @echo off
  2. echo a^
  3. b^
  4. c
  5. pause>nul
复制代码
同一个道理了,因为加了^之后第4行就没有换行符了,所以就接上第5行的b^\n\r,此时还是占据一行,所以结果就是:
  1. a^\n\r                        //这里是第3行的\n\r
  2. b^\n\r                       //这里原来是第4行,现在第5行的b^\n\r接上去了
复制代码
所以效果就是:
  1. a
  2. b
复制代码
首先你要明白的就是换行符负责把字符串向下移一行,回车符负责把开始打印的位置放到字符串的开头

TOP

回复 13# JooKin

你说的其它的都对,比如以/n/r(换行回车)结尾,/n(换行)在前
例如:
  1. @echo off
  2. echo a^
  3. b
  4. pause>nul
复制代码
结果是
  1. ab
复制代码
这点有力的证明^确实转义的是换行符。

   受益很多, 感谢你的回复。我还是不能理解,按你说的
cmd以换行回车为一条命令的结束标志是相符的

那么
  1. @echo off\n\r
  2. echo a^\n\r
  3. \n\r
  4. ^\n\r
  5. b^\n\r
  6. \n\r
  7. ^\n\r
  8. c\n\r
  9. pause>nul
复制代码
这里为什么没有在第3行就结束,第3行不是有个换行回车吗?

TOP

本帖最后由 JooKin 于 2011-9-19 20:43 编辑

回复 14# Hello123World


    不是的,执行完第3行(严格来说应该是第2行,因为^的存在原来的第3行已经接上第2行的末尾成为一行了)已经结束了。看下面的两个例子就明白了:
  1. ::例1
  2. @echo off
  3. echo Hey,Hello123World!
  4. pause
复制代码
结果:
  1. Hey,Hello123World!
  2. 请按任意键继续. . .
复制代码
  1. ::例2
  2. @echo off
  3. echo Hey,Hello123World!^
  4. pause
复制代码
结果:
  1. Hey,Hello123World!
  2. 请按任意键继续. . .
复制代码
第2个例子只是在第2行末尾加了个^,为什么结果会多一个空行?因为加了^后,第3行的\n\r接上了第2行的末尾,跟第2行成为1行了,此时的第3行的位置已经是原来第4行的\n\r了。这个时候执行完第2行,因为末尾有原来的第三行的\n\r,所以到此就结束了。接下来就轮到执行第3行的内容了,并且是另起一行(这个应该不用解释了,因为上一行有\n存在),但是因为第3行只有\n\r(原来第4行的\n\r)了,没有任何命令,所以造成的结果就是执行第4行的pause的时候又另起一行了,很明显是因为第3行的\n的缘故,所有整个结果跟第1个例子相比就是中间多出了\n\r(原来第4行的\n\r),即空行。

还有就是连续的多个\n\r只有一个起作用,再结合前面两个例子看:
  1. @echo off
  2. echo Hey,Hello123World!^
  3. pause
复制代码

TOP

返回列表