中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

中国DOS联盟论坛
现在时间是 2026-08-12 10:44
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » IF 和 SET 命令的疑惑,还请前辈指教。 查看 1,991 回复 3
楼 主 IF 和 SET 命令的疑惑,还请前辈指教。 发表于 2010-12-31 14:27 ·  中国 广东 东莞 电信
初级用户
积分 23
发帖 13
注册 2009-06-02 07:33
17年会员
UID 146527
性别 男
状态 离线
第一个:得出的结果 %a%依然是1,为什么不是2呢?
@echo off
set a=1
set /p p= y/n:
if "%p%" == "y" (
set /a a+=1
echo %a%
pause
)
exit

第二个:得出的结果%a%是2。
@echo off
set a=1
set /p p= y/n:
if "%p%" == "y" (
set /a a+=1
)
echo %a%
pause
exit

第三个:得出的结果也是2。
@echo off
set a=1
set /p p= y/n:
set /a a+=1
call :m
pause
)
:m
echo %a%

虽然可以不用if直接算出,但是有时需要到这样。
我非常的疑惑,经过思考,实验,我是这样解释:
if ()括号以外的是一级命令,括号里的命令属于二级命令,当执行二级命令时是从一级命令里取的参数,而二级命令是不能从二级取得参数。这样也就能说明
第一个和第二个里的echo %a% 的不同。
第三个的echo %a% 依然是属于if ()括号外的一级命令,通过CALL调用,只是改变执行的顺序。
不知道我这样的想法是否正确,还请各位前辈指教。
晚辈感谢不尽。
我不是人
2 发表于 2010-12-31 16:29 ·  中国 上海 联通
新手上路
积分 13
发帖 11
注册 2010-08-24 11:36
15年会员
UID 172893
性别 男
来自 上海
状态 离线
个人感觉是if语句延迟扩展导致的
你启动延迟扩展:
@echo off
setlocal EnableDelayedExpansion
set a=1
set /p p= y/n:
if "%p%" == "y" (
set /a a+=1
echo !a!
)
pause
这时候会打印2了
本帖最近评分记录 (共 1 条) 点击查看详情
评分人分数时间
lzbow +2 2011-01-02 13:50
3 发表于 2011-01-02 15:08 ·  中国 湖北 武汉 电信
新手上路
积分 2
发帖 3
注册 2010-12-17 23:19
15年会员
UID 179444
性别 男
状态 离线
学习了
4 发表于 2011-01-02 15:35 ·  中国 吉林 延边朝鲜族自治州 延吉市 电信
银牌会员
★★★
正在学习中的菜鸟...
积分 1,039
发帖 897
注册 2009-03-01 15:34
17年会员
UID 140302
性别 男
来自 在地狱中仰望天堂
状态 离线
论坛跳转: