Board logo

标题: [求助]在for语句里set,有bug?(麻烦版主,高手进来下) [打印本页]

作者: fantasybb     时间: 2009-4-16 11:47    标题: [求助]在for语句里set,有bug?(麻烦版主,高手进来下)

这个问题是有关处理ini文件的,搜索了以前的帖子,觉得我这个问题不需要那么复杂。这个问题是:
     现有test.ini文件内容如下:
[system]
a=1
b=2
[server]
c=3
[client]
d=4
e=5
下面的这个P是为了显示除[server]块以外的内容:
@echo off
setlocal enabledelayedexpansion
set t="0"
for /f "delims=" %%i in (test.ini) do (
        if /i "%%i"=="[server]" set t="1"
        rem 测试可在此echo !t!
        if /i !t!=="0" echo %%i
        if /i !t!=="1" (
                set tempi=%%i
                if "!tempi!"=="[client]" set t="0" &echo %%i
        )
        rem 测试可在此echo !t!
)
pause
很显然,结果出乎意外。结果只显示到[client],如下
[system]
a=1
b=2
[client]
但错误在哪我死活想不出来。去掉@echo off后分析,在test.ini中运行到[server]以前都是正确的,在[server]这行,!t!的值变成了"1",也是对的。然后一直运行到[client]这行,!t!变成了"0",并且[client]这句也显示了出来。但下面的就都显示不出来了!看!t!的值也都是"0"啊!为什么此时
        if /i !t!=="0" echo %%i
这句就不执行了呢?
     期待高手帮我分析一下!

[ Last edited by fantasybb on 2009-4-16 at 12:05 ]
作者: s11ss     时间: 2009-4-16 12:34    标题: 可能是bug,改用defined判断可以——空格惹的祸……


@echo off
setlocal enabledelayedexpansion
set t=
for /f "delims=" %%i in (test.ini) do (
        if /i "%%i"=="[server]" set t="1"
        rem 测试可在此echo !t!
        if not defined t echo %%i
        if defined t (
                set tempi=%%i
                if "!tempi!"=="[client]" set t=&echo %%i
        )
        rem 测试可在此echo !t!
)
pause
[ Last edited by s11ss on 2009-4-16 at 13:06 ]
作者: 26933062     时间: 2009-4-16 12:37
bug 应该不太可能吧。。
分析代码太累了,先看看你是想要这个效果吗?
:
@echo off&setlocal enabledelayedexpansion
for /f "delims=" %%a in (a.txt) do (
   set "var=%%a"
   if "!var:~0,1!"=="[" set "flag="
   if /i "%%a"=="[server]" set flag=a
   if not defined flag echo %%a
)
pause

作者: 26933062     时间: 2009-4-16 12:46
:

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

[ Last edited by 26933062 on 2009-4-16 at 12:50 ]
作者: fantasybb     时间: 2009-4-16 12:50
恩,s11ss和26933062的都满足要求。谢谢你俩!
不过,我的那个代码确实是个bug吧?到d=4或e=5这两行的时候,t明明是等于"0"的,竟然不做if /i !t!=="0" echo %%i这个判断?
作者: fantasybb     时间: 2009-4-16 12:53


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

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

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


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

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

防止变量不小心包含值附近的空格,应当写作:
set "t=0"
作者: Climbing     时间: 2009-4-16 13:30    标题: Re fantasybb:

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

下面是排除bug后的代码,只有一个字节的差别,看你能不能找到:
@echo off
setlocal enabledelayedexpansion
set t="0"
for /f "delims=" %%i in (test.ini) do (
        if /i "%%i"=="[server]" set t="1"
        rem 测试可在此echo !t!
        if /i !t!=="0" echo %%i
        if /i !t!=="1" (
                set tempi=%%i
                if "!tempi!"=="[client]" set t="0"&echo %%i
        )
        rem 测试可在此echo !t!
)
pause
事实上,你的代码还有很多其它的bug(例如,将[client]中的任何一个字母大写),暂时我修正成如下情况:
@echo off
setlocal enabledelayedexpansion
set t=0
for /f "delims=" %%i in (test.ini) do (
        if /i "%%i"=="[server]" set t=1
        if !t!==0 echo %%i
        if !t!==1 (
                set tempi=%%i
                if /i "!tempi!"=="[client]" set t=0&echo %%i
        )
)
pause

作者: Climbing     时间: 2009-4-16 13:36
晕,等我发出帖子后,发现4楼的已经找到bug所在。

另外,s11ss兄在7楼推荐的设置变量(避免多余空格)方法确实更经典。
作者: yishanju     时间: 2009-4-16 14:29


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


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

是不是还可以这样写(set a=xxxx)
作者: HAT     时间: 2009-4-16 15:34    标题: Re 10楼

括号还是少用为好吧