Board logo

标题: [文件操作] 为何批处理命令if else不能达到我要的效果? [打印本页]

作者: 0428_hai    时间: 2009-9-14 19:06     标题: 为何批处理命令if else不能达到我要的效果?

  1. @cls & echo off & color e
  2. echo.
  3. set "var=" & set /p var= 输入密钥:
  4. if defined var (
  5. if %var%==211 start d:\bat\abc.txt
  6. ) else (
  7. echo 密钥不正确!
  8. )
复制代码
这段代码,要实现的功能很明确,就是我输入211才可以打开abc.txt文件,输入不正确或者不做任何输入都要显示“密钥不正确”。
但是这段代码达不到我的目的,是if else语句写的有问题吗?
为什么我输入其他字符,然后不提示“密钥不正确”,而我直接回车时,提示“此时不应有Start”呢?
作者: pusofalse    时间: 2009-9-14 19:13

把@echo off 去掉,看下运行流程就知道了。
作者: 0428_hai    时间: 2009-9-14 19:33

去掉echo off后的结果
作者: pusofalse    时间: 2009-9-14 19:45     标题: 回复 3楼 的帖子

由这个结果,你看到并且想到了什么?只贴图就完事了啊?
作者: 0428_hai    时间: 2009-9-14 20:31

我不理解才发帖问啊。
为什么第二个我直接回车了,没有定义var变量,按理说第一个()中的内容不执行,直接执行else后的内容才对,可实际不是,先来了一个此时不应有Start,然后又出来一个
if ==211……
不知道这儿的if else执行流程是如何。
作者: pusofalse    时间: 2009-9-14 21:03

第一个()中的内容的确不执行,但仍会替换为其值。
if ==211这句不存在语法错误吗?
换句话说,在语句未被解析执行之前,cmd.exe会把%%闭合的变量替换为常量值。
if defined var (
if %var%==211 start d:\bat\abc.txt
) else (
echo 密钥不正确!
)
这其实是一条语句,一条完整的语句。搜索下变量延迟,会明白处理流程的。
作者: netbenton    时间: 2009-9-14 21:07

是批处理的预处理问题,
系统把整个if段,同时处理,扩展了%号变量后,第二个if出现了语法错误,

不要认为是执行了第一个if后条件不成立,系统会放弃第二个if,
实际上,在这里还没有执行第一个if的。

如果仅仅是变量找不到的话,系统是不会中断程序的,只有预处理不正确这种严重错误才会中断
解决办法:
if %var%==211
改为:
if "%var%"=="211"
作者: 斜雨孤泪    时间: 2011-12-3 16:26

回复 7# netbenton

按您说的改了,在输入字符不等于211的情况下,不会显示“密码错误”而是显示的“任意键继续~”
作者: cjiabing    时间: 2011-12-3 17:02

  1. @echo off
  2. cls
  3. set  var=
  4. ::你的问题在这里,不必双引号,双引号包括空格,输入空格就会错误。
  5. set /p var=请输入:
  6. if defined var (
  7. if %var%==211  (star  ""  c:\abc.bat) else (echo 失败)
  8. )
  9. pause
复制代码

最好用if not "%var%"=="" 代替if defined,原因是你没有排除空格。
作者: 斜雨孤泪    时间: 2011-12-3 17:02

回复 8# 斜雨孤泪


    :ee
@cls & echo off & color e
echo.
set "var=" & set /p var= 输入密钥:
if defined var (
if "%var%"=="211" (start d:\bat\abc.txt
) else (
echo 密钥不正确!
)) else (
echo 密钥不正确!
)
pause & goto ee
作者: 斜雨孤泪    时间: 2011-12-3 17:20

本帖最后由 斜雨孤泪 于 2011-12-3 17:22 编辑

回复 9# cjiabing


我调试了一下,输入为空格时错误信息如下
5行至末尾:
此时不应有 (star。
==========================
我觉得"ver="不含空格哦,看我改的:
  1. @echo off
  2. :ee
  3. cls &echo.
  4. set "var=" & set /p var= 输入密钥:
  5. if defined var (if "%var%"=="211" (start d:\bat\abc.txt) else (echo 密钥不正确!)
  6. )else (echo 密钥不正确!)
  7. pause & goto ee
复制代码

作者: yyykkkyyyy    时间: 2011-12-3 20:09

本帖最后由 yyykkkyyyy 于 2011-12-3 20:16 编辑

呵呵 体谅一下,初学是有个过程的,建议先简后繁
  1. @echo off
  2. :ee
  3. cls &echo.
  4. set /p var= 输入密钥:
  5. if "%var%"=="211" (start d:\bat\abc.txt) else (
  6.    echo 密钥不正确!
  7.    pause & goto ee
  8. )
复制代码
说明:
1  if .... (命令A) else 命令B 这带else的, 前面括号是必须的
2  如果 var 未定义,则 "%var%" 形同 "" ,自然不会满足 if "%avr%"=="211"
  和输入一个不等于211的处理方式 相同,同时由于没排除var为空或仅有空格,引号不能少否则预处理后可能形成   if   ==211  这种语法不合格的(当然用别的方式也能排除此错误如 if a%var%==a211 )
3  当套有多个if 及多条命令,对初学者而言,按层次书写缩进式代码更能表达其逻辑关系,且别人也易读




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