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 没有被定义
- pause
复制代码 什么都没显示,直接执行后面的 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 没有被定义
- pause
复制代码 乖乖,你终于出来了。。。!
再试试多个空格时如何?测试代码 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 没有被定义
- pause
复制代码 哈哈,真的可以。。。
但是这样似乎也太麻烦了点。!!若是含多个空格,岂不是要写上一大堆的变量??
试试将变量名赋值给别的变量试试。。
看 代码 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 没有被定义
- pause
复制代码 嗯,果然可以。。这下简单多了。。。
但是需注意的是仍然得用!!来引用变量。
总结:
检测含空格的变量名是否被定义过,需开启延迟变量,
并把 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 没有被定义
- )
- pause
复制代码 果然可以,而且可以不用开启变量延迟。
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
问题二: 变量的截取。
先看一段代码- ::代码 2-1
- @echo off
- setlocal EnableDelayedExpansion
- set a=fff
- set var=abc
- if defined !var:~0,1! (echo a 被定义了) else echo a 没有被定义
- pause
复制代码 居然又是老问题 ???!!!
明明开启了延迟变量啊。。!
试试不用变量的延迟扩展看看- ::代码 2-2
- @echo off
- setlocal EnableDelayedExpansion
- set a=fff
- set var=abc
- if defined %var:~0,1% (echo a 被定义了) else echo a 没有被定义
- pause
复制代码 可以了,还真是麻烦,忽左忽右、忽上忽下的,头的晕了。。。
那么在 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 没有被定义
- )
- pause
复制代码 竟然一闪而过,语法错误了。。汗。。!
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
最后总结:
用 if defined 判断某个变量是否被定义过时需注意以下2点:
1、不能直接输入空格,有空格时需用变量来代替,且必须是用双!!来引用这个值含空格的变量
也就是必须开启延迟变量,或者将需判断的变量名赋值给 for 的 %%i 变量。
2、若判断的变量名需要使用变量的字符截取功能时,则与上面的正好相反。
即:不能使用!!来引用变量,即使是在for中也是一样。
更新:但可以 if defined !num:~1! 或 if defined !num:~-1!
不能同时指定两个数字,或者说不能出现逗号。
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
[ 本帖最后由 随风 于 2009-5-10 12:44 编辑 ] |