0

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
4

1 に答える 1

1

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

...そして、今何が起こるか見てください。

于 2013-03-29T02:04:35.123 に答える