Board logo

标题: [原创] 帮助开关/?的分析测试 [打印本页]

作者: qzwqzw    时间: 2014-12-8 01:43     标题: 帮助开关/?的分析测试

本帖最后由 qzwqzw 于 2014-12-9 23:31 编辑

几乎所有的Windows的命令行程序都支持/?开关
这个开关的作用就是显示命令的帮助信息
但是测试发现这个开关有很多有意思的事情

大多数程序的/?开关可以放在其他参数或开关之前、之后或之间
即使中间没有空格 比如 dir xxxx/?yyyy
都仍然可以正常解读/?并显示帮助信息
除非/?紧跟在一个/的后面
cmd会把//?误以为是一个//开关和一个?字符串
而///?会被cmd认为是一个//的开关和一个/?开关
所以仍然可以正常显示帮助信息

但是对于echo,if,for,rem命令就比较特殊



ECHO
如果将/?放在其他字符串前面
echo /?yyy仍然显示帮助信息
如果将/?放在其他字符串后面
echo xxx/?会放弃显示帮助信息
也就是说echo仅在第一个参数以/?起始时
才显示帮助信息
这也就是echo+/?可以显示/?
而echo=/?却显示帮助信息的原因之一

FOR
如果将/?放在其他字符串前面或后面并且没有空格
for xxx/?yyy仍然显示帮助信息
如果/?前后有空格
for xxx /?或者for /? yyy会报不应有xxx和yyy的错误
也就是说for仅在有且只有一个参数并包含/?时
才显示帮助信息
这是因为for后面有其他关键字
所以/?必须作为一个独立参数单独解析

IF
如果将/?放在其他字符串前面或者后面
则if都会放弃显示帮助信息
if xxx/?会显示帮助信息
if /?yyy==/?yyy会比较字符串
if /?==/?既不会显示帮助也不比较字符串
而是会报不应有/?的语法错误
也就是说if仅在有且只有一个参数并以/?结尾i时
才显示帮助信息
所以仅在两个字符串的前面添加防御字符是有风险的

REM
rem的情况与for相似
如果/?后有空格,比如rem xxx/? yyy
即/?被理解为第一个参数
则会报不应有yyy的错误
如果/?前有空格,比如rem xxx /?yyy
即/?被理解为第二个参数
则rem将注释所有的字符串
也就是说rem仅在有且只有一个参数并包含/?时
才显示帮助信息
所以代码中使用rem注释时第一个字符串千万不能包含/?
作者: bailong360    时间: 2014-12-9 19:43

还真是的,这位兄弟果真细心啊,以前知道dir的/?放在哪里都没问题




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2