很多时候,我们需要检查某个变量的值是否为空,以便做后续处理。
对于这个问题,很多人会毫不犹豫地选择 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
很多时候,我们需要检查某个变量的值是否为空,以便做后续处理。 对于这个问题,很多人会毫不犹豫地选择 if "%str%"=="" …… 的句式,在早期的批处理中,还可以看到这样的语句:if [%str%]==[],有人把这两种写法称为“防空字符”。 可是,这样做真的能在各种复杂的情况下判断某个变量的值是否为空吗? 答案是否定的。 先来看 if [%str%]==[],当%s
在CMD使用IF /?打开IF的系统帮助会发现IF有3种基本的用法!
第一种用法:IF [NOT] ERRORLEVEL number command
这种用法现在很少用了,因为它需要使用到CHOICE命令,这个命令现在被set /p代替了,它是
判断
CHOICE命令选择的选项的,CHOICE命令是一个提供选项功能的命令。
这个用法的基本做用是
判断
上一条命令执行结果的代码,以决定...
判断
变量
的是否存在不等于
判断
其是否有值。
不能混淆。
变量
首先得存在, 即在系统中有定义, 然后确实存在后才能对其进行值得各种
判断
。
-如果存在但未赋值, 其初值可能为空 “”, 一般
判断
其
是否为空
的用法为:IF "%VAR%" == ""
-如果不存在, 还去用此
变量
比较,则必然出错。
这两天在修改一个batch文件,出现了一个错误
self-transcendence:
Wireshark 在Win7 安装完成后找不到网卡解决方法
tchmuzi:
Wireshark 在Win7 安装完成后找不到网卡解决方法
-宫商角徵-:
Wireshark 在Win7 安装完成后找不到网卡解决方法
dmxai: