找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 39849|回复: 11

[文件操作] 为何批处理命令if else不能达到我要的效果?

[复制链接]
发表于 2009-9-14 19:06:57 | 显示全部楼层 |阅读模式
  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”呢?
发表于 2009-9-14 19:13:35 | 显示全部楼层
把@echo off 去掉,看下运行流程就知道了。
 楼主| 发表于 2009-9-14 19:33:46 | 显示全部楼层
去掉echo off后的结果
发表于 2009-9-14 19:45:14 | 显示全部楼层

回复 3楼 的帖子

由这个结果,你看到并且想到了什么?只贴图就完事了啊?
 楼主| 发表于 2009-9-14 20:31:12 | 显示全部楼层
我不理解才发帖问啊。
为什么第二个我直接回车了,没有定义var变量,按理说第一个()中的内容不执行,直接执行else后的内容才对,可实际不是,先来了一个此时不应有Start,然后又出来一个
if ==211……
不知道这儿的if else执行流程是如何。
发表于 2009-9-14 21:03:08 | 显示全部楼层
第一个()中的内容的确不执行,但仍会替换为其值。
if ==211这句不存在语法错误吗?
换句话说,在语句未被解析执行之前,cmd.exe会把%%闭合的变量替换为常量值。
if defined var (
if %var%==211 start d:\bat\abc.txt
) else (
echo 密钥不正确!
)
这其实是一条语句,一条完整的语句。搜索下变量延迟,会明白处理流程的。
发表于 2009-9-14 21:07:37 | 显示全部楼层
是批处理的预处理问题,
系统把整个if段,同时处理,扩展了%号变量后,第二个if出现了语法错误,

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

如果仅仅是变量找不到的话,系统是不会中断程序的,只有预处理不正确这种严重错误才会中断
解决办法:
if %var%==211
改为:
if "%var%"=="211"
发表于 2011-12-3 16:26:16 | 显示全部楼层
回复 7# netbenton

按您说的改了,在输入字符不等于211的情况下,不会显示“密码错误”而是显示的“任意键继续~”
发表于 2011-12-3 17:02:19 | 显示全部楼层

  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:32 | 显示全部楼层
回复 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:07 | 显示全部楼层
本帖最后由 斜雨孤泪 于 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
复制代码
发表于 2011-12-3 20:09:12 | 显示全部楼层
本帖最后由 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 及多条命令,对初学者而言,按层次书写缩进式代码更能表达其逻辑关系,且别人也易读
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-20 05:32 , Processed in 0.020378 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表