Пакетний сценарій: Проблеми з SET в IF

Проблема полягає в тому, що мій 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
Як написав Aacini, вам потрібно скористатись затримкою розширення, замість CALL: process% 1% 2% натисніть%% cl% вам потрібно CALL: process% 1% 2! Tap! % cl%
додано Автор jeb, джерело
Якщо набір та не працюють, віддача, швидше за все, не буде виконана вся галузь.
додано Автор GolezTrol, джерело
що станеться, якщо запустити скрипт без дозволу розширення? і що ваш ": процес"?
додано Автор weberik, джерело
все інше працює, але "set = tap = c: \ ca \ sf \ 1st 2nd 3rd та ін ... без enableelayed його не працює взагалі, my: process - це ще один код, де його робота добре, якщо я не ставлю ця частина коду ..
додано Автор Spaceballs, джерело

1 Відповіді

Ви пропустили першу команду SET. Лінія

tap=C:\ny

повинно бути

set tap=C:\ny

When you use a variable that is modified inside an IF or FOR its value повинно бути expanded with !var! and not with %var%; otherwise the expanded value is the value the variable had BEFORE enter the IF or FOR (this is the objective of EnableDelayedExpansion). For example:

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

Previous segment show: With percent: Old value. With exclamation: New value

Додатковий коментар:

Хоча , якщо NEWYORK ==% region% є таким самим, як , якщо% 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  
2
додано
@Spaceballs: я змінив ваш код, перевірте його ...
додано Автор Aacini, джерело
Я спробував це вже, проблема не з! або% його з "set" в "if"
додано Автор Spaceballs, джерело