[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 是批处理set命令的BUG吗?

cmd输入
set a=1
set a=
if "%a%"=="" echo 空值
if not "%a%"==""  echo 被赋值
结果会发现显示的是“被赋值”,是BUG嘛?
【新青年世界】
windows+R
cmd
start http:/hi.baidu.com/huajinghua

你应该清楚了的。麻烦你解释一下。
静水流深...

TOP

set "a=1"
::下面一行用引号括起来就看到你的代码中有一个空格了
set "a= "
if "%a%"=="" echo 空值
if not "%a%"==""  echo 被赋值

TOP

没有被赋值,就是不存在,就要用 if defined 语句

TOP

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

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

心在天山,身老沧州。

TOP

返回列表