|
plp626
银牌会员
     钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
『楼 主』:
【讨论】关于注释::的疑问
使用 LLM 解释/回答一下
大家都知道::比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
set t=%1
::set t=%t:*=%
pause
代码四:(好,将注释加强下,仍然语法错误,一闪而过!)
@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怎么解释这个::的?
---------------------
再赋个语法错误的代码:
代码六:一闪而过
@echo off
set t=2121212
call set t=%t:*=%
pause
Last edited by plp626 on 2008-5-11 at 09:00 AM ]
此帖被 +4 点积分 点击查看详情 评分人:【 slore 】 | 分数: +4 | 时间:2008-5-11 10:26 |
|
|

山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具)~~ 空间~~cmd学习 |
|
2008-5-11 08:24 |
|
|
bat-zw
金牌会员
      永远的学习者
积分 3105
发帖 1276
注册 2008-3-8
状态 离线
|
|
2008-5-11 08:35 |
|
|
plp626
银牌会员
     钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
『第 3 楼』:
使用 LLM 解释/回答一下
Originally posted by zw19750516 at 2008-5-11 08:35 AM:
兄弟不妨在::后加个空格试试看::: set...
仍为语法错误:
@echo off
call:r 2121212
pause
:r
set t=%1
:: set t=%t:*=%
echo %t%
pause
CMD不会因加了空格对后面内容视而不见,它还要解释,这CMD真是个SB
|

山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具)~~ 空间~~cmd学习 |
|
2008-5-11 08:40 |
|
|
bat-zw
金牌会员
      永远的学习者
积分 3105
发帖 1276
注册 2008-3-8
状态 离线
|
『第 4 楼』:
使用 LLM 解释/回答一下
@echo off
call:r 2121212
pause
:r
set t=%1
rem set t=%t:*=%
echo %t%
pause
这样也是一样。
@echo off
call:r 2121212
pause
:r
:: set t=%t:*=%
set t=%1
echo %t%
pause
而这样就没问题了,真的是怪了。
Last edited by zw19750516 on 2008-5-11 at 08:54 AM ]
|

批处理之家新域名:www.bathome.net |
|
2008-5-11 08:50 |
|
|
plp626
银牌会员
     钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
|
2008-5-11 08:50 |
|
|
regvip2008
初级用户
 
积分 187
发帖 87
注册 2007-10-23
状态 离线
|
『第 6 楼』:
使用 LLM 解释/回答一下
哈哈,谢谢plp626兄,发现了一个这么有趣的现象!先顶一个!!
我个人认为,应该是cmd在读取到::标签时,若发现其后为SET为某个变量进行字符替换,当遇到set t=%t:*=%这个严重的语法错误时,将不会再返回错误,而直接退出,然而造成set t=%t:*=%这个严重的语法错误是“*”在作怪!所以用set t=%t:^*=%就可以运行了!
|
|
2008-5-11 09:58 |
|
|
plp626
银牌会员
     钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
|
2008-5-11 14:55 |
|
|
slore
铂金会员
      
积分 5212
发帖 2478
注册 2007-2-8
状态 离线
|
|
2008-5-11 14:58 |
|
|
plp626
银牌会员
     钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
『第 9 楼』:
使用 LLM 解释/回答一下
Originally posted by zw19750516 at 2008-5-11 08:50 AM:
@echo off
call:r 2121212
pause
:r
set t=%1
rem set t=%t:*=%
echo %t%
pause
这样也是一样。
@echo off
call:r 2121212
pause
:r
:: set t=%t:*=%
set t=%1
e ...
4楼的,用rem和::效果一样。。。
|

山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具)~~ 空间~~cmd学习 |
|
2008-5-11 14:59 |
|
|
slore
铂金会员
      
积分 5212
发帖 2478
注册 2007-2-8
状态 离线
|
『第 10 楼』:
使用 LLM 解释/回答一下
哦。
注释和echo我觉得一样的处理机制
rem虽然不回显,但是还是支持变量的引用。
所以在没有t变量的时候你::掉,rem点没有关系,但是你set t后,
对rem或者echo的内容是要检查的。
所以我觉得echo的了的,应该都可以rem……
rem的有错的,理论上echo也应该有错。
|
|
2008-5-11 15:10 |
|
|
xzyx
初级用户
 
积分 50
发帖 19
注册 2008-2-9
状态 离线
|
『第 11 楼』:
使用 LLM 解释/回答一下
嗯,我说一下我的看法:
为什么“set t=%t:*=%”这句会错,是因为批处理有这样的语法--“set mypath=%mypath:*\=%”,意思是将第一个“\”之前的内容清空。也就是说“*”在“%%”中是被赋予特殊含义的。
而在变量延迟开启的情况下,“set t=!t:*=!”这句的结果是“t:*=”,也就是说“*”在“!!”中没有被赋予特殊含义。
那么问题究竟处在哪里呢?应该还是出现在符号的优先级上。也就是说“*”和“%”优先级大于“:”。
那么为什么“rem”也会出错呢?因为批处理是要进行预处理的,而在符号处理阶段已经出错。
|
|
2008-5-11 19:26 |
|
|
xzyx
初级用户
 
积分 50
发帖 19
注册 2008-2-9
状态 离线
|
|
2008-5-11 19:40 |
|
|
knoppix7
银牌会员
    
积分 1287
发帖 634
注册 2007-5-2 来自 cmd.exe
状态 离线
|
|
2008-5-11 19:44 |
|
|
plp626
银牌会员
     钻石会员
积分 2278
发帖 1020
注册 2007-11-19
状态 离线
|
『第 14 楼』:
使用 LLM 解释/回答一下
.....那么为什么“rem”也会出错呢?因为批处理是要进行预处理的,而在符号处理阶段已经出错。
rem/?
在批处理文件或 CONFIG.SYS 里加上注解或说明。
那谁分析下command解释代码的内部机制,分几个阶段,每个阶段干什么,
优先级。。?
|

山外有山,人外有人;低调做人,努力做事。
进入网盘(各种工具)~~ 空间~~cmd学习 |
|
2008-5-11 20:58 |
|
|
pooronce
中级用户
  
积分 484
发帖 250
注册 2007-6-5
状态 离线
|
『第 15 楼』:
使用 LLM 解释/回答一下
测试了一下,发现不管加不加引号,是不是先把环境变量延迟打开都是这样,赶明儿再到2003下面试一下
……问题应该出现在cmd的解释执行机制不同的,可能它最先就是把变量解释出来的,对于注释这里,应该的确算是bug。 有条件的试下在vista及win2008里面这个bug还存在不
|
|
2008-5-11 21:10 |
|