Пакетный скрипт: проблемы с SET в IF - PullRequest
1 голос
/ 28 октября 2011

Проблема в том, что мои set tap=c:\ca\sf\1st 2nd... и т. Д. Вообще не работают. echo ничего не показывает, set по какой-то причине не помещает путь в переменную. У меня все if правильно, есть еще проблема?

setlocal enabledelayedexpansion  

    if NEWYORK == %region% (  
        set tap=C:\ny  
        CALL :process %1 %2 %tap% %cl%  
        GOTO :EOF  
    )  
    if California == %region% (  
        if '%3'=='sanfrancisco' (  
            set cl=c:\ca\sf\cl  
            if '%2'=='1st' set tap=c:\ca\sf\1st  
            if '%2'=='2nd' set tap=c:\ca\sf\2nd  
            if '%2'=='3rd' set tap=c:\ca\sf\3rd  
            if '%2'=='4th' set tap=c:\ca\sf\4th  
            if '%2'=='5th' set tap=c:\ca\sf\5th  
            echo %tap%, echo %cl%,  
            pause  
            CALL :process %1 %2 %tap% %cl%  
            GOTO :EOF  
        )  
        if '%3' == 'LosAngeles' (  
            set tap=c:\ca\la  
            set cl=c:\ca\la\cl  
            echo %tap%, %cl%  
            pause  
            CALL :process %1 %2 %tap% %cl%  
            GOTO :EOF  
        )  
        set tap=c:\USA  
        set cl=c:\usa\cl  
        echo %tap%, %cl%  
        pause  
        CALL :process %1 %2 %tap% %cl%  
        GOTO :EOF ) else (  
        echo faiiiiiiiiiillllllllll  
        pause  
        GOTO :END)  
    endlocal  
    GOTO :EOF  

1 Ответ

2 голосов
/ 29 октября 2011

Вы пропустили первую команду SET. Линия

tap=C:\ny

должно быть

set tap=C:\ny

Когда вы используете переменную, которая изменяется внутри IF или FOR, ее значение должно быть расширено с помощью! Var! а не с% var%; в противном случае расширенное значение - это значение, которое переменная ПРЕЖДЕ ЧЕМ введите IF или FOR (это цель EnableDelayedExpansion). Например:

set var=Old value
if 1 == 1 (
    set var=New value
    echo With percent: %var%. With exclamation: !var!
)

Предыдущий сегмент шоу: With percent: Old value. With exclamation: New value

Дополнительный комментарий:

Хотя if NEWYORK == %region% совпадает с if %region% == NEWYORK при его выполнении, второй является привычным и более понятным с точки зрения программистов.

EDIT

Я немного изменил ваш код. Посмотрите на это:

    setlocal enabledelayedexpansion  

    if /I %region% == NEWYORK (  
        set tap=C:\ny  
        REM cl IS NOT DEFINED HERE, BUT USED IN NEXT LINE
        CALL :process %1 %2 !tap! !cl!
        GOTO :EOF  
    )  

    if /I %region% == California (  
        if /I '%3' == 'sanfrancisco' (  
            set cl=c:\ca\sf\cl  
            set tap=c:\ca\sf\%2
            echo !tap!, !cl!
            pause  
            CALL :process %1 %2 !tap! !cl!
            GOTO :EOF  
        )  
        if /I '%3' == 'LosAngeles' (  
            set tap=c:\ca\la  
            set cl=c:\ca\la\cl  
            echo !tap!, !cl!  
            pause  
            CALL :process %1 %2 !tap! !cl!
            GOTO :EOF  
        )  
        set tap=c:\USA  
        set cl=c:\usa\cl  
        echo !tap!, !cl!
        pause  
        CALL :process %1 %2 !tap! !cl!
        GOTO :EOF
    ) else (  
        echo faiiiiiiiiiillllllllll  
        pause  
        GOTO :END
    )  
    endlocal  
    GOTO :EOF  
...