本帖最后由 CrLf 于 2011-12-17 00:10 编辑
回复 8# jellyhk
回复 11# Demon
话说这个技巧学习自 plp626 的函数,因为简单实用而一直沿用了下来。
正如 awk 所说,有一部分是因为兼容空双引号的原因,曾纠结于一个问题,如何既能兼容空参数(即 "" 这样只有一对双引号的参数),又能兼容可能存在的特殊字符呢?不过当时感觉 call 没啥用,所以没有做进一步猜测和大量测试。- @echo off
- call :test "" test 1
- call :test "" test 1
- pause
- :test
- echo if %1.==. echo k
- echo if "%~1"=="" echo k
- echo ----end----
复制代码 在 call 中,特殊字符是无法正常输出的(前阵子向 zqz 请教时得到的结果,丧气),也就是说,&、|、<、>这几个字符必须靠双引号转义输出,无法用 ^ 单独转义,而双引号无法单独输出、若要输出 % 与引号之外的转义符需要成倍的数量(二次扩展特性),还有让人无法理解的是 ^ 的数量居然会翻倍。
所以,call的时候不建议用转义符,也几乎不需要用转义符(除了正反括号 (、) 外,其余字符都仅能用双引号转义)。
这些问题应该是 cmd 接受 shell 参数时也存在的问题,测试过,用 ftype batfile="%1" %* ^& 修改关联方式,强制为 bat 文件添加特殊字符参数,结果同样存无法在引号对之法输出特殊字符的情况,似乎 cmd 遇到包含特殊字符的参数就六亲不认了,不过此时 ^ 倍增的情况倒是没有出现。- @echo off
- call echo ^&
- call echo ^^^&
- call echo "&"
- ::特殊字符只能用双引号转义输出
- call echo "^"
- ::^ 的数量翻倍...
- call :test ^" 参数2
- call :test ^^^" 参数2
- call :test "" 参数2
- ::转义符无能
- pause&exit
-
- :test
- echo 参数1:[%1]
- echo 参数2:[%2]
复制代码 综上所述,if "%~1"=="" 与 if %1.==. 各有优势。
if "%~1"=="" 无法判断空参数,但兼容其余任何情况,所以适合在存在带有语法性质的未闭合括号情况下用,比如:- call :test ()
- pause&exit
- :test
- for /l %%a in (1 1 5) do (
- if "%~1" neq "" set /a n+=%%a
- )
- ::"%~1" 在参数为 () 时也不会导致语法错误,但是会把 "" 等同于空
复制代码 if %1.==. 其实不惧怕除了 ( 与 ) 之外的特殊字符,而且兼容空参数,所以适合用于不存在带有语法意义的未闭合括号情况下用,如:- call :test ""
- pause&exit
- :test
- for /l %%a in (1 1 5) do if %1. neq . set /a n+=%%a
- ::%1. 能够判断 "",但是在参数为 () 时则可能导致语法错误
复制代码 前者是绝不会出语法错误的稳妥写法,后者是能判断任何类型参数但是需要推敲位置避免语法错误的写法,对一般的调用来说,前者比较简便不容易出错,而对于函数来说,后者确实是简洁通用的选择。
至于可读性,其实个人认为两种写法貌似差不多,只是前者频频出镜,大家看得眼熟了就比较好认,对不认识扩展参数的人看来,%~1 可能还更难理解呢。
我感觉代码的可读性似乎更多地体现在注释上,代码的可读性则要面对更多的人群,俗话说众口难调么,反而不好把握。所以吧,即使有可读性的需求,我也是以注释为主,代码上也没有考虑太多...
个人看法,哈哈 |