|
报告几个问题,并提几个建议。
报告几个问题,并提几个建议。
1. 在批处理中%~0,%~d0,%~p0,%~f0替换的结果可能不正确。
如果把批处理文件如test.bat放在%@path%{即(bd)/boot/gub/}中,然后在命令行中直接输入test.bat,那么%~dp0替换的结果将是%@root%/{即()/},而不是%@path%{即(bd)/boot/gub/}。下面是测试脚本test.bat,test和test的执行结果test.txt
test.bat- !BAT
- #本文件保存为%@path%test.bat
- command --set-path=(bd)/BOOT/GRUB/
- echo %^0-> %0 >> (bd)/test.txt
- echo %^@root%-> %@root% >> (bd)/test.txt
- echo %^@path%-> %@path% >> (bd)/test.txt
- echo %^~d0-> %~d0 >> (bd)/test.txt
- echo %^~p0-> %~p0 >> (bd)/test.txt
- echo %^~n0-> %~n0 >> (bd)/test.txt
- echo %^~x0-> %~x0 >> (bd)/test.txt
- echo %^~f0-> %~f0 >> (bd)/test.txt
- echo -e \n >> (bd)/test.txt
- pause
复制代码 test- !BAT
- #本文件保存为(bd)/boot/grub/test
- command --set-path=(bd)/boot/grub/
- test.bat
- root ()/boot/ && test.bat
- root %@path% && test.bat
- root %@path% && %@root%/test.bat
- root (hd0,0) && test.bat
- %@path%test.bat
复制代码 test.txt- %0-> test.bat
- %@root%-> (hd0,4)
- %@path%-> (bd)/BOOT/GRUB/
- %~d0-> (hd0,4)
- %~p0-> /
- %~n0-> test
- %~x0-> .bat
- %~f0-> (hd0,4)/test.bat
- %0-> test.bat
- %@root%-> (hd0,4)/boot
- %@path%-> (bd)/BOOT/GRUB/
- %~d0-> (hd0,4)
- %~p0-> /boot/
- %~n0-> test
- %~x0-> .bat
- %~f0-> (hd0,4)/boot/test.bat
- %0-> test.bat
- %@root%-> (hd0,4)/BOOT/GRUB
- %@path%-> (bd)/BOOT/GRUB/
- %~d0-> (hd0,4)
- %~p0-> /BOOT/GRUB/
- %~n0-> test
- %~x0-> .bat
- %~f0-> (hd0,4)/BOOT/GRUB/test.bat
- %0-> (hd0,4)/BOOT/GRUB/test.bat
- %@root%-> (hd0,4)/BOOT/GRUB
- %@path%-> (bd)/BOOT/GRUB/
- %~d0-> (hd0,4)
- %~p0-> /BOOT/GRUB/
- %~n0-> test
- %~x0-> .bat
- %~f0-> (hd0,4)/BOOT/GRUB/test.bat
- %0-> test.bat
- %@root%-> (hd0,0)
- %@path%-> (bd)/BOOT/GRUB/
- %~d0-> (hd0,0)
- %~p0-> /
- %~n0-> test
- %~x0-> .bat
- %~f0-> (hd0,0)/test.bat
- %0-> (bd)/BOOT/GRUB/test.bat
- %@root%-> (hd0,0)
- %@path%-> (bd)/BOOT/GRUB/
- %~d0-> (bd)
- %~p0-> /BOOT/GRUB/
- %~n0-> test
- %~x0-> .bat
- %~f0-> (bd)/BOOT/GRUB/test.bat
复制代码 最后举一个实际的批处理文件无法正常工作的例子,在grub4dos工具箱中,如果我先执行command --set-path=(bd)/BOOT/,root (bd)然后再执行PRELOAD.BAT,那么PRELOAD.BAT无法正常工作,因为此时%~p0将被替换成/而不是/BOOT/
2. 在变量名中也可以使用特殊字符,只是有一些限制。
受内部变量%@root%,%@path%,?_uuid的启发,我猜测在变量名中也可以使用特殊字符,经测试我发现:
(1)变量名的第一个字符可以是@?`~[]{}|等字符,set无法显示以@?开头的变量,
(2)在变量名中还可以使用<.>/等字符,
(3)除内部变量外,以@开头的变量事实上是存在的,但是它们的值永远为空,无论你如何设置都不管用,即"%@variable%"将被替换成"",其他的变量都正常。变量不存在和变量的值是空值在语义上还是有所区别的,例如如果@variable不存在,那么echo "%@variable%"执行的结果将是"%@variable%",而如果@variable的值为空,那么echo "%@variable%"执行的结果将是""。
(4)if命令的子命令exist无法识别非标准的变量名,甚至是内部变量也无法识别,即if exist @root echo @root exist ! echo @root not exist的执行结果始终是@root not exist
现在我可以说,变量命中不准使用特殊符号只是一个编程规范,而不是语法的强制要求。然而grub4dos自己却打破了它,在内部变量中使用了特殊符号。
建议强化语法,彻底禁止特殊符号的使用。同时,建议修改内部变量的名字,在grub2中内部变量就直接使用root path等名字,没有添加任何特殊符号,建议还是向grub2靠拢吧,把root path作为保留的关键字,禁止用户使用,无忧论坛上的批处理中也几乎没有人把root等作为变量名使用,应该不会破坏现有的带吗,造成兼容性问题。
3. grub4dos再加入批处理功能时,开始对内部变量、命令、子命令、参数不区分大小写,然而又有一些命令参数区分大小写,例如:set /A。建议还是保持grub4dos的习惯,区分大小写吧,对内部变量、命令、子命令、参数一般都是用小写,除非特别声明要使用大写。无忧论坛上的批处理中也几乎没有人使用大写,应该不会破坏现有的带吗,造成兼容性问题。
4. 建议增加使用{}包括复合语句和组合命令的功能。
cmd.bat有时候不能正常工作,就是grub4dos缺乏使用{}包括复合语句和组合命令的功能造成的。例如,如果cmd = command1 || command2,那么 if %cmd% && command3将无法正常工作,但是如果增加使用{}包括复合语句和组合命令的功能,那么 if {%cmd%} && command3将完全正常。
5. help命令提供的信息有些过时了,例如:在help command 提供的信息中说--set-path的默认值是(bd)/grub/,而事实上现在是(bd)/BOOT/GRUB/。对于一个软件来说,在所有的参考文档,help命令通常是最权威的,而且很多时候,终端用户是没有help.chm和readme.txt的,只能依靠help命令,help命令出错,后果就有点严重了。下面使我设想的一种解决方案,给所有的命令添加一个-help参数,在修改各个命令时,同时修改-help参数的输出信息,而help命令这直接调用各个命令的-help参数,这样能够有效减少help命令的维护工作。
[ 本帖最后由 2011_dihuo0 于 2011-7-2 12:42 编辑 ] |
|