找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 19852|回复: 1

[原创] 帮助开关/?的分析测试

[复制链接]
发表于 2014-12-8 01:43:36 | 显示全部楼层 |阅读模式
本帖最后由 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注释时第一个字符串千万不能包含/?

评分

参与人数 1PB +6 技术 +1 收起 理由
cjiabing + 6 + 1 感谢分享

查看全部评分

发表于 2014-12-9 19:43:01 | 显示全部楼层
还真是的,这位兄弟果真细心啊,以前知道dir的/?放在哪里都没问题
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 05:45 , Processed in 0.023414 second(s), 12 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表