Board logo

标题: [其他] 是批处理set命令的BUG吗? [打印本页]

作者: huajinghua    时间: 2008-4-5 19:56     标题: 是批处理set命令的BUG吗?

cmd输入
set a=1
set a=
if "%a%"=="" echo 空值
if not "%a%"==""  echo 被赋值
结果会发现显示的是“被赋值”,是BUG嘛?
作者: 梦想种子    时间: 2008-4-5 21:22

你应该清楚了的。麻烦你解释一下。
作者: more    时间: 2008-4-19 21:32

set "a=1"
::下面一行用引号括起来就看到你的代码中有一个空格了
set "a= "
if "%a%"=="" echo 空值
if not "%a%"==""  echo 被赋值
作者: heaton    时间: 2008-4-20 09:01

没有被赋值,就是不存在,就要用 if defined 语句
作者: namejm    时间: 2008-4-27 09:32

  实地测试了一番(把 set a= 后面的空格去掉之后测试的,楼主应该是多打了个空格),发现在CMD窗口中显示的确实是“被赋值”,但是,把最后一个echo改为 echo %a% ,结果显示的是 %a% 本身,并不是一个空值;把这个代码放到批处理文件中执行,显示的是 空值 。

  从上面的测试结果来看,CMD窗口中执行命令的结果和批处理文件中执行的结果是不尽相同的,有时候甚至是截然相反的。之所以造成在CMD窗口中显示被赋值,而批处理中显示的是空值,推测成因是这样的:在CMD窗口中,当把某个变量设置为空值的时候,该变量将直接从内存中删除,所以, if "%a%"=="" 在执行的时候,比较的是 "%%" 字符串和 "" 字符串;而在批处理文件中,当变量为空时,该变量名将保留在内存中,而值被设置为空,所以,if "%a%"==""  在执行的时候,比较的是 ""=="" 。至于更深层的原因,应该和不同环境对内存的存取操作有关,本人水平有限,期待后来之人的详尽分析。




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2