![]() |
中国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遇到::后,其后的字符视而不见了(非复合句里),但是我今天发现自己错了: 大家讨论下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: 仍为语法错误: 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/? 那谁分析下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 |