中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 【讨论】关于注释::的疑问
« [1] [2] »
作者:
标题: 【讨论】关于注释::的疑问 上一主题 | 下一主题
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『楼 主』:  【讨论】关于注释::的疑问

大家都知道::比rem要解释得快,所以注释一直用::来代替rem
我以前一直以为cmd遇到::后,其后的字符视而不见了(非复合句里),但是我今天发现自己错了:

  Quote:
预先知识:set t=%t:*=%是个严重的语法错误,正确为:set “t=%t:^*=%”
代码一:因语法错直接一闪而过

  Quote:
@echo off
call:r 2121212
pause
:r
set t=%1
::set t=%t:*=%
echo %t%
pause

代码二:正确

  Quote:
@echo off
call:r "2121212"
pause
:r
set t=%1
::
echo %t%
pause

好像是call在做怪:
代码三:(正确执行)
@echo off
set t=%1
::set t=%t:*=%
pause
代码四:(好,将注释加强下,仍然语法错误,一闪而过!)

  Quote:
@echo off
call:r 2121212
pause
:r
set t=%1
:::set t=%t:*=%
echo %t%
pause

看来是*作怪:(另换一个语法错误的语句"if 5==")
代码五:正确

  Quote:
@echo off
call:r 2121212
pause
:r
set t=%1
::if 5==
echo %t%
pause


大家讨论下cmd怎么解释这个::的?
---------------------
再赋个语法错误的代码:

  Quote:
代码六:一闪而过
@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
状态 离线
『第 2 楼』:  

兄弟不妨在::后加个空格试试看::: set...



批处理之家新域名:www.bathome.net
2008-5-11 08:35
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 3 楼』:  



  Quote:
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 楼』:  


@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
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 5 楼』:  

进一步发现:

  Quote:
子过程里,若t有定义,那么注释语句里只要含有%t:*=时就是语法错误,CMD将直接退出。





山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-5-11 08:50
查看资料  发短消息 网志   编辑帖子  回复  引用回复
regvip2008
初级用户





积分 187
发帖 87
注册 2007-10-23
状态 离线
『第 6 楼』:  

哈哈,谢谢plp626兄,发现了一个这么有趣的现象!先顶一个!!
我个人认为,应该是cmd在读取到::标签时,若发现其后为SET为某个变量进行字符替换,当遇到set t=%t:*=%这个严重的语法错误时,将不会再返回错误,而直接退出,然而造成set t=%t:*=%这个严重的语法错误是“*”在作怪!所以用set t=%t:^*=%就可以运行了!

2008-5-11 09:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 7 楼』:  

我认为这是批文件注释的一个bug,有谁不同意???

[ Last edited by plp626 on 2008-5-11 at 02:58 PM ]



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-5-11 14:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
slore
铂金会员





积分 5212
发帖 2478
注册 2007-2-8
状态 离线
『第 8 楼』:  

不算吧?
CMD没有那个语句说明这个是注释语句……
你用rem看看有错没?

2008-5-11 14:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 9 楼』:  



  Quote:
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
这样也是一样。
[code]
@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 楼』:  

哦。

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

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

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

所以我觉得echo的了的,应该都可以rem……
rem的有错的,理论上echo也应该有错。

2008-5-11 15:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
xzyx
初级用户





积分 50
发帖 19
注册 2008-2-9
状态 离线
『第 11 楼』:  

嗯,我说一下我的看法:
为什么“set t=%t:*=%”这句会错,是因为批处理有这样的语法--“set mypath=%mypath:*\=%”,意思是将第一个“\”之前的内容清空。也就是说“*”在“%%”中是被赋予特殊含义的。
而在变量延迟开启的情况下,“set t=!t:*=!”这句的结果是“t:*=”,也就是说“*”在“!!”中没有被赋予特殊含义。

那么问题究竟处在哪里呢?应该还是出现在符号的优先级上。也就是说“*”和“%”优先级大于“:”。
那么为什么“rem”也会出错呢?因为批处理是要进行预处理的,而在符号处理阶段已经出错。

2008-5-11 19:26
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
xzyx
初级用户





积分 50
发帖 19
注册 2008-2-9
状态 离线
『第 12 楼』:  

这只是批处理运行的机制,而不应该理解为bug。

2008-5-11 19:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
knoppix7
银牌会员





积分 1287
发帖 634
注册 2007-5-2
来自 cmd.exe
状态 离线
『第 13 楼』:  

难道传说中的预扩充还在起作用.....

2008-5-11 19:44
查看资料  发短消息 网志   编辑帖子  回复  引用回复
plp626
银牌会员

钻石会员


积分 2278
发帖 1020
注册 2007-11-19
状态 离线
『第 14 楼』:  



  Quote:
.....那么为什么“rem”也会出错呢?因为批处理是要进行预处理的,而在符号处理阶段已经出错。



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

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

优先级。。?



山外有山,人外有人;低调做人,努力做事。

进入网盘(各种工具)~~ 空间~~cmd学习
2008-5-11 20:58
查看资料  发短消息 网志   编辑帖子  回复  引用回复
pooronce
中级用户





积分 484
发帖 250
注册 2007-6-5
状态 离线
『第 15 楼』:  

测试了一下,发现不管加不加引号,是不是先把环境变量延迟打开都是这样,赶明儿再到2003下面试一下

……问题应该出现在cmd的解释执行机制不同的,可能它最先就是把变量解释出来的,对于注释这里,应该的确算是bug。 有条件的试下在vista及win2008里面这个bug还存在不

2008-5-11 21:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: