批处理判断变量值是否为空的终极方法
很多时候,我们需要检查某个变量的值是否为空,以便做后续处理。 对于这个问题,很多人会毫不犹豫地选择 if "%str%"=="" …… 的句式,在早期的批处理中,还可以看到这样的语句:if [%str%]==[],有人把这两种写法称为“防空字符”。 可是,这样做真的能在各种复杂的情况下判断某个变量的值是否为空吗? 答案是否定的。 先来看 if [%str%]==[],当%str%为空值的时候,它无疑能成功地捕获到这一情况,但是,如果%str%中含有特殊字符,比如>、&之类,这条语句就会报错。 为了兼容这几个特殊字符,人们绞尽脑汁,想到了 if "%str%"=="" 语句,于是,>、&、|之类的特殊字符也能顺利通过验证了,这是防空字符的一大进步。 但是,这条语句也不是完美的,因为有一个特殊字符它完全没办法处理! 这个特殊字符是什么呢? 它就是双引号"本身! 我们执行一下如下代码:
- @echo off
- set str="
- if "%str%"=="" (echo yes) else echo no
- pause
CMD.EXE报错了:命令语法错误。 原来,上面这条if语句执行的是 if """=="" ……,引号起到分组字符串的作用,而引号对是就近匹配的:第一个引号和第二个引号配成一对,第三个引号和第四个引号配成一对,第五个引号和第六个引号配成一对……,这条if语句最终的执行的是 if "==……,但是引号始终要作为分组字符来使用的,而单个的引号没有找到下一个可匹配的引号,所以就出现了语法错误。 当把 %str% 的值改为两个引号的时候,上面这段代码的执行结果居然显示为no,想想这是为什么。 if "%str%"==""……能兼容大部分特殊字符,但是偏偏不能兼容引号本身,那么,判断某个变量的值是否为空,是不是就没有更好的办法了呢? 答案是肯定的,那就是:用 if defined str 语句来判断变量值是否为空。 请执行以下代码:
- @echo off
- :Main
- cls
- set str=
- set /p "str=请输入任意字符,或直接回车:"
- if defined str (
- echo 变量 str 的值不为空
- ) else echo 变量 str 为空值
- pause
- goto Main