批'FOR'循环解析器

时间:2013-03-29 01:45:57

标签: batch-file

我有一小段代码应该通过一个名为data.dta的文件进行解析但由于某种原因它一直在说(此时出乎意料,这是代码(我把这条线的注释放到了我的位置)错误):

:load
cd %appdata%\.Trek
FOR /f "eol=#" %%t IN (Resources\Data\data.dta) DO ( ::problem line
        set count=1
    set cor=0
    FOR /f "tokens=1-2 delims=^=" %%f IN ("%%t") DO (
        If %count% == 1 (
            IF %%f==VERSION set cor=1
        )
        If %count% == 2 (
            IF %cor%==1 (
                set cor=0
                set ver=%%f
            )
        )
        set /a count=%count%+1
    )
)    
Title TREK Unmounted Console Version: %ver%

data.dta的内容:

VERSION=ALPHA 2

1 个答案:

答案 0 :(得分:1)

我可以发现一个主要问题,你需要启用延迟扩展才能正常工作。

在代码块中,所有变量都具有在 代码块启动之前 设置的值。如果您在代码块中设置 中的变量,只有在 之后才会有该值代码块。

试试这个例子:

@echo off
set var=1
echo %var%
for /l %%i in (1,1,5) do (
    set /a var+=1
    echo %var%
)
echo %var%
pause>nul

输出将是:

1
1
1
1
1
1
6

现在,尝试启用延迟扩展,并用感叹号替换百分号:

@echo off
setlocal enabledelayedexpansion
set var=1
echo %var%
for /l %%i in (1,1,5) do (
    set /a var+=1
    echo !var!
)
echo %var%

输出:

1
2
3
4
5
6
6

因此,请将您的代码更改为:

:load
cd %appdata%\.Trek
setlocal enabledelayedexpansion
FOR /f "eol=#" %%t IN (Resources\Data\data.dta) DO ( 
    set count=1
    set cor=0
    FOR /f "tokens=1-2 delims=^=" %%f IN ("%%t") DO (
        If !count! == 1 (
            IF %%f==VERSION set cor=1
        )
        If !count! == 2 (
            IF !cor!==1 (
            set cor=0
            set ver=%%f
            )
        )
        set /a count+=1
    )
)    
Title TREK Unmounted Console Version: %ver%
endlocal

......看看现在发生了什么。