[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
关于行末转义符的个人猜想
  看了楼主的教程,对于多行注释又学到了一招,以前只知道利用goto来进行多行注释。呵呵,感谢楼主为知识传播所付出的辛劳!
  此后看了各位朋友们对行末转义符的工作原理探讨,我也同楼主一样对行末转义符后连续空两行便不再工作感到困惑,另Jookin兄所说的行末是换行回车做为结束符号是不对的。因为我用16进制编辑器打开任一Windows中的文本类型文件(txt,cmd,vbs……)均看到行结束符号是0D 0A,即回车换行!
  受此启发,我将以下代码的输出重定向到一文本文件中后用UE打开查看其16进制时发现了一个有趣的现象。
  1. @echo off
  2. echo 1st:
  3. echo a^
  4. b
  5. echo.
  6. echo.
  7. echo.
  8. echo 2nd:
  9. echo a^
  10. b
  11. echo.
  12. echo.
  13. echo  3rd:
  14. echo a^
  15. b
  16. echo.
  17. echo.
  18. echo.
  19. echo 4th:
  20. echo a^
  21. ^
  22. b
复制代码
代码中之所以要增加若干空行是为了在16进制模式下各情况的输出结果能对齐,下面给出输出结果及在UE中打开查看其16进制的图片。

请大家注意看其16进制模式。
  情况1:a与b首尾相接。从结果看第3行的转义符将其后的回车换行符“删除”了。b后面的第一对回车换行是输出时正常产生的,后面的三对则是三条echo.产生的。
  情况2:a的后面是0A,所以输出结果表现为a,b各占一行。这就是说第9行的转义符将原来总共2对即4个(0D 0A 0D 0A)回车换行符“删除”了前三个。b后面的三对回车换行符解释同情况1。最后的空格(20)是我特意在“3rd”的前面加上的,以便三种情况对齐后分析。
  情况3:a的后面同样是0A,至于后面的4对回车换行符则是正常输出及第19、20、21行产生的。第17为空不会产生任何输出,第18行执行出错,也不会在此文件中产生输出。是不是也同情况2一样第15行的转义符将其后的4个回车换行符“删除”了三个,只留下最后一个呢?

  至此,我得出这样一个猜想:行末转义符将其后的回车换行符整体转义形成一个新的“转义”符,这个新的“转义”符对其后的回车符进行“转义”时将其“转义”为空(不是ASCII码为0的那个空,而是什么都没有的空。通俗地讲就是把回车符吃了,然后消失在人海。),或者说对其后的一对回车换行符“转义”为换行符(0A),而其它字符则原样输出。
  情况4验证了我的猜想。a后面的两个换行符(0A)分别由23、25行的转义符产生。
  以上猜想纯属个人见解,不对之处还请大家指正。
1

评分人数

    • CrLf: 有想法技术 + 1

TOP

回复 18# CrLf

        我同意将回车换行当成一个字符看待,这和我们的实际操作也是相符的,即每行结束转入下一行只需按一次回车键。你说“整个脚本中即使只有0A换行符也一样能执行”,我的理解是脚本源代码中即使行末只有0A,脚本也能正常工作。不知是不是这个意思?为此,我在UE中写了两句代码:
  1. @echo off
  2. echo 只认0A
复制代码
然后将第一行后的0D删除,保存后运行提示出错:
'ho' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
出错倒在我的意料之中,但命令怎么变成了'ho',这却让人伤神了。
删除0D后的脚本在UE和记事本中效果如图:

删除0D后的脚本:

敬请验证。

TOP

对不起,CrLf,我错了!在将echo后的文字改为全ASCII字符后,脚本确实能正常运行。出现上面的错误大概是编码的问题吧。

TOP

返回列表