中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-09-13 10:36
47,812 主题排行 / 349,916 发帖 / 今日 0 篇 / 48,268 会员排行
DOS批处理 & 脚本技术(批处理室) » 【讨论】关于注释::的疑问
可打印版本  2,530 / 16
第1楼 plp626 发表于 2008-05-11 08:24
银牌会员 发帖 1,020 积分 2,278
【讨论】关于注释::的疑问
大家都知道::比rem要解释得快,所以注释一直用::来代替rem
我以前一直以为cmd遇到::后,其后的字符视而不见了(非复合句里),但是我今天发现自己错了:

预先知识:set t=%t:*=%是个严重的语法错误,正确为:set “t=%t:^*=%”
代码一:因语法错直接一闪而过
@echo off
call:r 2121212
pause
:r
set t=%1
::set t=%t:*=%
echo %t%
pause
代码二:正确
@echo off
call:r "2121212"
pause
:r
set t=%1
::
echo %t%
pause


好像是call在做怪:
代码三:(正确执行)

代码四:(好,将注释加强下,仍然语法错误,一闪而过!)
@echo off
call:r 2121212
pause
:r
set t=%1
:::set t=%t:*=%
echo %t%
pause

看来是*作怪:(另换一个语法错误的语句"if 5==")
代码五:正确
@echo off
call:r 2121212
pause
:r
set t=%1
::if 5==
echo %t%
pause
大家讨论下cmd怎么解释这个::的?
---------------------
再赋个语法错误的代码:
代码六:一闪而过


[ Last edited by plp626 on 2008-5-11 at 09:00 AM ]
第2楼 bat-zw 发表于 2008-05-11 08:35
金牌会员 发帖 1,276 积分 3,105
兄弟不妨在::后加个空格试试看::: set...
第3楼 plp626 发表于 2008-05-11 08:40
银牌会员 发帖 1,020 积分 2,278
Originally posted by zw19750516 at 2008-5-11 08:35 AM:
兄弟不妨在::后加个空格试试看::: set...


仍为语法错误:


CMD不会因加了空格对后面内容视而不见,它还要解释,这CMD真是个SB
第4楼 bat-zw 发表于 2008-05-11 08:50
金牌会员 发帖 1,276 积分 3,105

这样也是一样。

而这样就没问题了,真的是怪了。

[ Last edited by zw19750516 on 2008-5-11 at 08:54 AM ]
第5楼 plp626 发表于 2008-05-11 08:50
银牌会员 发帖 1,020 积分 2,278
进一步发现:
子过程里,若t有定义,那么注释语句里只要含有%t:*=时就是语法错误,CMD将直接退出。
第6楼 regvip2008 发表于 2008-05-11 09:58
初级用户 发帖 87 积分 187
哈哈,谢谢plp626兄,发现了一个这么有趣的现象!先顶一个!!
我个人认为,应该是cmd在读取到::标签时,若发现其后为SET为某个变量进行字符替换,当遇到set t=%t:*=%这个严重的语法错误时,将不会再返回错误,而直接退出,然而造成set t=%t:*=%这个严重的语法错误是“*”在作怪!所以用set t=%t:^*=%就可以运行了!
第7楼 plp626 发表于 2008-05-11 14:55
银牌会员 发帖 1,020 积分 2,278
我认为这是批文件注释的一个bug,有谁不同意???

[ Last edited by plp626 on 2008-5-11 at 02:58 PM ]
第8楼 slore 发表于 2008-05-11 14:58
铂金会员 发帖 2,478 积分 5,212
不算吧?
CMD没有那个语句说明这个是注释语句……
你用rem看看有错没?
第9楼 plp626 发表于 2008-05-11 14:59
银牌会员 发帖 1,020 积分 2,278
Originally posted by zw19750516 at 2008-5-11 08:50 AM:

这样也是一样。
第10楼 slore 发表于 2008-05-11 15:10
铂金会员 发帖 2,478 积分 5,212
哦。

注释和echo我觉得一样的处理机制

rem虽然不回显,但是还是支持变量的引用。

所以在没有t变量的时候你::掉,rem点没有关系,但是你set t后,
对rem或者echo的内容是要检查的。

所以我觉得echo的了的,应该都可以rem……
rem的有错的,理论上echo也应该有错。
第11楼 xzyx 发表于 2008-05-11 19:26
初级用户 发帖 19 积分 50
嗯,我说一下我的看法:
为什么“set t=%t:*=%”这句会错,是因为批处理有这样的语法--“set mypath=%mypath:*\=%”,意思是将第一个“\”之前的内容清空。也就是说“*”在“%%”中是被赋予特殊含义的。
而在变量延迟开启的情况下,“set t=!t:*=!”这句的结果是“t:*=”,也就是说“*”在“!!”中没有被赋予特殊含义。

那么问题究竟处在哪里呢?应该还是出现在符号的优先级上。也就是说“*”和“%”优先级大于“:”。
那么为什么“rem”也会出错呢?因为批处理是要进行预处理的,而在符号处理阶段已经出错。
第12楼 xzyx 发表于 2008-05-11 19:40
初级用户 发帖 19 积分 50
这只是批处理运行的机制,而不应该理解为bug。
第13楼 knoppix7 发表于 2008-05-11 19:44
银牌会员 发帖 634 积分 1,287 来自 cmd.exe
难道传说中的预扩充还在起作用.....
第14楼 plp626 发表于 2008-05-11 20:58
银牌会员 发帖 1,020 积分 2,278
.....那么为什么“rem”也会出错呢?因为批处理是要进行预处理的,而在符号处理阶段已经出错。


rem/?
在批处理文件或 CONFIG.SYS 里加上注解或说明。


那谁分析下command解释代码的内部机制,分几个阶段,每个阶段干什么,

优先级。。?
第15楼 pooronce 发表于 2008-05-11 21:10
中级用户 发帖 250 积分 484
测试了一下,发现不管加不加引号,是不是先把环境变量延迟打开都是这样,赶明儿再到2003下面试一下

……问题应该出现在cmd的解释执行机制不同的,可能它最先就是把变量解释出来的,对于注释这里,应该的确算是bug。 有条件的试下在vista及win2008里面这个bug还存在不
1 2  下一页
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023