中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]在for语句里set,有bug?(麻烦版主,高手进来下)
作者:
标题: [求助]在for语句里set,有bug?(麻烦版主,高手进来下) 上一主题 | 下一主题
fantasybb
新手上路





积分 6
发帖 6
注册 2009-4-11
状态 离线
『楼 主』:  [求助]在for语句里set,有bug?(麻烦版主,高手进来下) 使用 LLM 解释/回答一下

这个问题是有关处理ini文件的,搜索了以前的帖子,觉得我这个问题不需要那么复杂。这个问题是:
现有test.ini文件内容如下:

a=1
b=2

c=3

d=4
e=5

下面的这个P是为了显示除块以外的内容:
@echo off
setlocal enabledelayedexpansion
set t="0"
for /f "delims=" %%i in (test.ini) do (
if /i "%%i"=="" set t="1"
rem 测试可在此echo !t!
if /i !t!=="0" echo %%i
if /i !t!=="1" (
set tempi=%%i
if "!tempi!"=="" set t="0" &echo %%i
)
rem 测试可在此echo !t!
)
pause

很显然,结果出乎意外。结果只显示到,如下

a=1
b=2


但错误在哪我死活想不出来。去掉@echo off后分析,在test.ini中运行到以前都是正确的,在这行,!t!的值变成了"1",也是对的。然后一直运行到这行,!t!变成了"0",并且这句也显示了出来。但下面的就都显示不出来了!看!t!的值也都是"0"啊!为什么此时
	if /i !t!=="0" echo %%i

这句就不执行了呢?
期待高手帮我分析一下!

Last edited by fantasybb on 2009-4-16 at 12:05 ]


2009-4-16 11:47
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 2 楼』:  可能是bug,改用defined判断可以——空格惹的祸…… 使用 LLM 解释/回答一下


@echo off
setlocal enabledelayedexpansion
set t=
for /f "delims=" %%i in (test.ini) do (
if /i "%%i"=="" set t="1"
rem 测试可在此echo !t!
if not defined t echo %%i
if defined t (
set tempi=%%i
if "!tempi!"=="" set t=&echo %%i
)
rem 测试可在此echo !t!
)
pause


Last edited by s11ss on 2009-4-16 at 13:06 ]


2009-4-16 12:34
查看资料  发短消息  网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 3 楼』:   使用 LLM 解释/回答一下

bug 应该不太可能吧。。
分析代码太累了,先看看你是想要这个效果吗?
:

@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (a.txt) do (
set "var=%%a"
if "!var:~0,1!"=="
" set flag=a
if not defined flag echo %%a
)
pause




致精致简!
2009-4-16 12:37
查看资料  发短消息  网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 4 楼』:   使用 LLM 解释/回答一下

:

所谓的bug 在这里
if "!tempi!"=="" set t="0" &echo %%i
&前面多了一个空格,所以导致 if /i !t!=="0" 判断不成立。
建议:楼主的变量赋值方式不太“健康”为什么一定要把引号赋在值内呢?


Last edited by 26933062 on 2009-4-16 at 12:50 ]


   此帖被 +3 点积分     点击查看详情   
评分人:【 s11ss 分数: +3  时间:2009-4-16 13:05




致精致简!
2009-4-16 12:46
查看资料  发短消息  网志   编辑帖子  回复  引用回复
fantasybb
新手上路





积分 6
发帖 6
注册 2009-4-11
状态 离线
『第 5 楼』:   使用 LLM 解释/回答一下

恩,s11ss和26933062的都满足要求。谢谢你俩!
不过,我的那个代码确实是个bug吧?到d=4或e=5这两行的时候,t明明是等于"0"的,竟然不做if /i !t!=="0" echo %%i这个判断?


2009-4-16 12:50
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
fantasybb
新手上路





积分 6
发帖 6
注册 2009-4-11
状态 离线
『第 6 楼』:   使用 LLM 解释/回答一下

Originally posted by 26933062 at 2009-4-16 12:46:
:

Last edited by 26933062 on 2009-4-16 at 12:50 ]

哈哈,谢谢!我上上礼拜刚学的P<img src="images/smilies/face-smile-big.png" align="absmiddle" border="0">所以代码不规范,呵呵。之所以用t=“0”就是因为有时候若用t=0有时候后面会“莫名其妙”地多个空格。现在明白了,哈哈<img src="images/smilies/face-smile-big.png" align="absmiddle" border="0">
有劳两位了!


2009-4-16 12:53
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
s11ss
银牌会员





积分 2098
发帖 566
注册 2007-9-11
状态 离线
『第 7 楼』:   使用 LLM 解释/回答一下

Originally posted by fantasybb at 2009-4-16 12:53 PM:

哈哈,谢谢!我上上礼拜刚学的P:D所以代码不规范,呵呵。之所以用t=“0”就是因为有时候若用t=0有时候后面会“莫名其妙”地多个空格。现在明白了,哈哈:D
有劳两位了!


防止变量不小心包含值附近的空格,应当写作:
set "t=0"


2009-4-16 13:09
查看资料  发短消息  网志   编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 8 楼』:  Re fantasybb: 使用 LLM 解释/回答一下

分析了一下你顶楼的代码,发现了bug所在。

下面是排除bug后的代码,只有一个字节的差别,看你能不能找到:

@echo off
setlocal enabledelayedexpansion
set t="0"
for /f "delims=" %%i in (test.ini) do (
if /i "%%i"=="" set t="1"
rem 测试可在此echo !t!
if /i !t!=="0" echo %%i
if /i !t!=="1" (
set tempi=%%i
if "!tempi!"=="" set t="0"&echo %%i
)
rem 测试可在此echo !t!
)
pause


事实上,你的代码还有很多其它的bug(例如,将中的任何一个字母大写),暂时我修正成如下情况:

@echo off
setlocal enabledelayedexpansion
set t=0
for /f "delims=" %%i in (test.ini) do (
if /i "%%i"=="" set t=1
if !t!==0 echo %%i
if !t!==1 (
set tempi=%%i
if /i "!tempi!"=="" set t=0&echo %%i
)
)
pause




偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2009-4-16 13:30
查看资料  发送邮件  访问主页  发短消息  网志  OICQ (653668)  编辑帖子  回复  引用回复
Climbing
铂金会员

网络独行侠


积分 6962
发帖 2753
注册 2003-4-16
来自 河北保定
状态 离线
『第 9 楼』:   使用 LLM 解释/回答一下

晕,等我发出帖子后,发现4楼的已经找到bug所在。

另外,s11ss兄在7楼推荐的设置变量(避免多余空格)方法确实更经典。




偶只喜欢回答那些标题和描述都很清晰的帖子!
如想解决问题,请认真学习“这个帖子”和“这个帖子”并努力遵守,如果可能,请告诉更多的人!
2009-4-16 13:36
查看资料  发送邮件  访问主页  发短消息  网志  OICQ (653668)  编辑帖子  回复  引用回复
yishanju
银牌会员

[b]看你妹啊[/b]


积分 1488
发帖 1357
注册 2006-5-20
状态 离线
『第 10 楼』:   使用 LLM 解释/回答一下

Originally posted by s11ss at 2009-4-16 13:09:


防止变量不小心包含值附近的空格,应当写作:
set "t=0"


是不是还可以这样写(set a=xxxx)





有问题请发论坛或者自行搜索,再短消息问我的统统是SB
2009-4-16 14:29
查看资料  发短消息  网志   编辑帖子  回复  引用回复
HAT
版主





积分 9023
发帖 5017
注册 2007-5-31
状态 离线
『第 11 楼』:  Re 10楼 使用 LLM 解释/回答一下

括号还是少用为好吧




2009-4-16 15:34
查看资料  发短消息  网志   编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: