标题: [文件操作] 为何批处理命令if else不能达到我要的效果? [打印本页]
作者: 0428_hai 时间: 2009-9-14 19:06 标题: 为何批处理命令if else不能达到我要的效果?
- @cls & echo off & color e
- echo.
- set "var=" & set /p var= 输入密钥:
- if defined var (
- if %var%==211 start d:\bat\abc.txt
- ) else (
- echo 密钥不正确!
- )
复制代码
这段代码,要实现的功能很明确,就是我输入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
- @echo off
- cls
- set var=
- ::你的问题在这里,不必双引号,双引号包括空格,输入空格就会错误。
- set /p var=请输入:
- if defined var (
- if %var%==211 (star "" c:\abc.bat) else (echo 失败)
- )
- 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="不含空格哦,看我改的:- @echo off
- :ee
- cls &echo.
- set "var=" & set /p var= 输入密钥:
- if defined var (if "%var%"=="211" (start d:\bat\abc.txt) else (echo 密钥不正确!)
- )else (echo 密钥不正确!)
- pause & goto ee
复制代码
作者: yyykkkyyyy 时间: 2011-12-3 20:09
本帖最后由 yyykkkyyyy 于 2011-12-3 20:16 编辑
呵呵 体谅一下,初学是有个过程的,建议先简后繁- @echo off
- :ee
- cls &echo.
- set /p var= 输入密钥:
- if "%var%"=="211" (start d:\bat\abc.txt) else (
- echo 密钥不正确!
- pause & goto ee
- )
复制代码
说明:
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 |