if defined 需知
:: code 随风 @bbs.bathome.net 2008-10-01
if defined 命令 使用需注意的地方。
我们经常使用 if defined 命令来判断某个变量是否被定义过。这个命令非常有用,使用频率也颇高。
但是 if defined 确有些错误的用法容易被忽略,个人曾吃过亏,费了九牛二虎之力才找到出错原因。
也许各路高人早以心知肚明,但网上却好像很少有人讨论。(也许是我孤陋寡闻了,呵呵)
现就个人经验作个总结,知道的一笑而过,不知道的可以少走些弯路。
错误的欢迎指出。。。
问题一: 空格问题。
测试 代码 1-1 | ::代码 1-1 | | @echo off | | set ab cd=fff | | if defined ab cd (echo ab cd 被定义了) else echo ab cd 没有被定义 | | pauseCOPY |
什么都没显示,直接执行后面的 pause 命令了,按说应该显示 “ab cd 被定义了”才对呀。
问题出在空格上
总结: if defined 这里不能有空格。
再测试 代码 1-2 | ::代码 1-2 | | @echo off | | set ab cd=fff | | set "var= " | | if defined ab%var%cd (echo ab cd 被定义了) else echo ab cd 没有被定义 | | pause | | [code] | | 我们把空格用变量来代替,结果还是一样,郁闷!难道就不能检测含空格的变量名是否被定义过吗? | | 不信邪,继续。。。 | | 测试 代码 1-3 | | [code] | | ::代码 1-3 | | @echo off | | setlocal enabledelayedexpansion | | set ab cd=fff | | set "var= " | | if defined ab!var!cd (echo ab cd 被定义了) else echo ab cd 没有被定义 | | pauseCOPY |
乖乖,你终于出来了。。。!
再试试多个空格时如何?测试代码 1-4 | ::代码 1-4 | | @echo off | | setlocal enabledelayedexpansion | | set a b c d e=fff | | set "var= " | | if defined a!var!b!var!c!var!d!var!e ( | | echo a b c d e 被定义了 | | ) else echo a b c d e 没有被定义 | | pauseCOPY |
哈哈,真的可以。。。
但是这样似乎也太麻烦了点。!!若是含多个空格,岂不是要写上一大堆的变量??
试试将变量名赋值给别的变量试试。。
看 代码 1-5 | ::代码 1-5 | | @echo off | | setlocal EnableDelayedExpansion | | set ab cd=fff | | set "var=ab cd" | | if defined !var! (echo ab cd 被定义了) else echo ab cd 没有被定义 | | pauseCOPY |
嗯,果然可以。。这下简单多了。。。
但是需注意的是仍然得用!!来引用变量。
总结:
检测含空格的变量名是否被定义过,需开启延迟变量,
并把 if defined 这里的所有空格都用变量来代替
或是将变量名赋值给别的变量,再用!!来引用这个新的变量。
再试试 代码 1-6
看看在 for 中是否能行?感觉应该是可以的,因为for的 %%i 也是变量啊。
试试再说。。 | ::代码 1-6 | | @echo off | | set a b c d=fff | | for /f "delims=" %%i in ("a b c d") do ( | | if defined %%i (echo %%i 被定义了) else echo %%i 没有被定义 | | ) | | pauseCOPY |
果然可以,而且可以不用开启变量延迟。
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
问题二: 变量的截取。
先看一段代码 | ::代码 2-1 | | @echo off | | setlocal EnableDelayedExpansion | | set a=fff | | set var=abc | | if defined !var:~0,1! (echo a 被定义了) else echo a 没有被定义 | | pauseCOPY |
居然又是老问题 ???!!!
明明开启了延迟变量啊。。!
试试不用变量的延迟扩展看看 | ::代码 2-2 | | @echo off | | setlocal EnableDelayedExpansion | | set a=fff | | set var=abc | | if defined %var:~0,1% (echo a 被定义了) else echo a 没有被定义 | | pauseCOPY |
可以了,还真是麻烦,忽左忽右、忽上忽下的,头的晕了。。。
那么在 for 中呢?
代码 2-3 | ::代码 2-3 | | @echo off | | setlocal EnableDelayedExpansion | | set "a=fff" | | set "b=fff" | | set "c=fff" | | set "var=abc" | | for /l %%i in (0 1 2) do ( | | if defined !var:~%%i,1! (echo a 被定义了) else echo a 没有被定义 | | ) | | pauseCOPY |
竟然一闪而过,语法错误了。。汗。。!
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
最后总结:
用 if defined 判断某个变量是否被定义过时需注意以下2点:
1、不能直接输入空格,有空格时需用变量来代替,且必须是用双!!来引用这个值含空格的变量
也就是必须开启延迟变量,或者将需判断的变量名赋值给 for 的 %%i 变量。
2、若判断的变量名需要使用变量的字符截取功能时,则与上面的正好相反。
即:不能使用!!来引用变量,即使是在for中也是一样。
更新:但可以 if defined !num:~1! 或 if defined !num:~-1!
不能同时指定两个数字,或者说不能出现逗号。
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
[ 本帖最后由 随风 于 2009-5-10 12:44 编辑 ] |